JAXB – 从生成的XML中移除standalone =“yes”

你知道一个JAXB设置来防止在生成的XML中生成standalone =“yes”吗?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
 marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE); 

可以用来没有

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

但我不会考虑这个最佳做法。

在JAXB中是JDK1.6的一部分

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

你可以使用

 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,从而避免了独立=“是”属性。

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

然而,独立的XML可以在任何地方使用(而非独立式对于不加载外部的XMLparsing器是有问题的)。

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

如果仅使用默认的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(); 
 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部分的其余部分

就在别人还在为这个问题苦苦挣扎的时候,你可以考虑使用

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

删除所有的XML声明,并在输出stream/方法的开始处写入自己的String

我没有足够的“声誉”有“特权”评论。 😉

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

如果我使用“internal”属性,则会得到一个javax.xml.bind.PropertyException