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