2008-11-10 582 views

回答

52
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE); 

可用于没有

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 

但是我难道不认为这是最好的做法。

+2

谢谢,这正是我所需要的。我同意最好的做法是包括这一行,但我接口的Web服务并不期望它。 – jgrowl 2010-03-17 15:29:15

+6

不错,它的工作原理,但FWIW,如果服务无法接受合法的xml,服务就会被破坏,所以可能很好的提交一个bug报告。 – StaxMan 2011-01-08 08:05:26

+4

不适用于JDK1.6中的JAXB。请参阅so_mv的答案以获得正确的解决方案。 – sversch 2012-08-14 07:32:29

3

如果您使文档依赖于DOCTYPE(例如,使用命名实体),那么它将停止独立,因此standalone="yes"将不允许在XML声明中使用。

但是独立XML可以在任何地方使用(对于不加载外部数据的XML解析器而言,非独立式会产生问题)。

我不明白这个声明是如何成为一个问题的,除了与不支持XML的软件的互操作性,还有一些破解的本土XML类巫术。

99

在JAXB是JDK1.6

的一部分
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 
52

您可以使用

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 

marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE) 

禁用默认XML声明,然后添加你的定制XML声明,

<?xml version="1.0" encoding="UTF-8"?> 

通过

marshaller.setProperty("com.sun.xml.bind.xmlHeaders", 
     "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 

于所生成的XML,从而避免了独立= “是”属性。

2
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>"); 

这对JDK1.7有效。 standalone = \“no \”可以被移除以获得xml部分的剩余部分

0

我没有足够高的“声誉”来拥有“特权”发表评论。 ;-)

@Debasis,请注意,您所指定的属性:

"com.sun.xml.internal.bind.xmlHeaders" 

应该是:

"com.sun.xml.bind.xmlHeaders" (without the "internal", which are not meant to be used by the public) 

如果我用的是 “内部” 属性像你一样,我得到一个javax.xml.bind。PropertyException

3

只是当其他人还在这个问题struggeling,您可以考虑使用

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 

删除所有的XML声明的,只是写自己的String你的输出流/方法的开始

2

如果您仅使用缺省javax.xml包,可以将编组器的JAXB_FRAGMENT选项设置为'true'(这省略了默认的xml处理指令),并使用XMLStreamWriter的writeProcessingInstruction方法插入您自己的:

xmlStreamWriter.writeProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\""); 
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 
jaxbMarshaller.marshal(object, xmlStreamWriter); 
xmlStreamWriter.writeEndDocument();