Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未创建JAXB-XML声明_Java_Xml_Jaxb - Fatal编程技术网

Java 未创建JAXB-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=

我使用以下代码使用JAXB创建XML,但是创建XML时不包括XML声明

代码:

XML声明:


如何让它输出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();

< P>这个问题已经很好地回答了

总之,您需要做的是:

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);