Java 未创建JAXB-XML声明
我使用以下代码使用JAXB创建XML,但是创建XML时不包括XML声明 代码: XML声明:Java 未创建JAXB-XML声明,java,xml,jaxb,Java,Xml,Jaxb,我使用以下代码使用JAXB创建XML,但是创建XML时不包括XML声明 代码: XML声明: 如何让它输出XML声明?您不需要写入文件,可以在内存中这样做: ... ByteArrayOutputStream os = new ByteArrayOutputStream(); jaxbMarshaller.marshal(test, os); StringBuffer content = new StringBuffer("<?xml version=\"1.0\" encoding=
如何让它输出XML声明?您不需要写入文件,可以在内存中这样做:
...
ByteArrayOutputStream os = new ByteArrayOutputStream();
jaxbMarshaller.marshal(test, os);
StringBuffer content = new StringBuffer("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>");
content.append(os.toString());
System.out.println("jaxb xml = " + os.toString());
response.setContentType("text/plain");
response.setHeader("Content-Disposition", "attachment;filename=xmlTest.xml");
String generatedXML = content.toString();
System.out.println("full xml = " + generatedXML);
InputStream is = new ByteArrayInputStream(generatedXML);
final int bufferSize = 4096;
OutputStream output = new BufferedOutputStream(response.getOutputStream(), bufferSize);
for (int length = 0; (length = is.read(buffer)) > 0;) {
output.write(buffer, 0, length);
}
output.flush();
output.close();
。。。
ByteArrayOutputStream os=新建ByteArrayOutputStream();
jaxbMarshaller.marshall(测试,操作系统);
StringBuffer内容=新的StringBuffer(“”);
content.append(os.toString());
System.out.println(“jaxbxml=“+os.toString());
response.setContentType(“文本/普通”);
setHeader(“内容处置”、“附件;文件名=xmlTest.xml”);
String generatedXML=content.toString();
System.out.println(“完整xml=“+generatedXML”);
InputStream is=新的ByteArrayInputStream(生成的XML);
最终int bufferSize=4096;
OutputStream输出=新的BufferedOutputStream(response.getOutputStream(),bufferSize);
对于(int-length=0;(length=is.read(buffer))>0;){
输出.写入(缓冲区,0,长度);
}
output.flush();
output.close();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE);
请注意,如果这是相关的,为什么要将内容类型指定为“text/plain”而不是“text/xml”或“application/xml”?还要注意,写入文件可能不是线程安全的。为什么不改用StringWriter呢?如果我把它写到内存中,用户还能下载吗?如果是,怎么做?在这里,我刚刚用“将输入流复制到输出流”更新了答案。该解决方案需要一些异常处理,这都是由内存完成的。它导致将该异常添加到XML的开头,而它本应是添加的第二个XML标记,它还导致XML格式奇怪地将所有内容放在一行上<代码>在我看来,JAXB确实添加了XML声明(第二个)。我已经用两个
println()
语句更新了答案,所以请检查输出。至于您将Marshaller.JAXB_FORMATTED_OUTPUT
设置为true
?当它打印到文件时,XML声明丢失,但是当我打印到控制台时,它就在那里了。这就是我要打印的内容:stringbuffercontent=newstringbuffer(os.toString());系统输出打印项次(内容)代码>从阅读该问题的过程中,这一行似乎应该删除XML声明?如果您将其设置为XML片段,那么您就是在告诉JAXB,您封送的XML将被合并到一个更大的XML文档中。如果为TRUE,则表示JAXB正在创建完整的XML文档,因此它包含声明。实际答案没有任何漏洞!
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE);