您是否知道防止在生成的 XML 中生成独立 =“yes”的 JAXB 设置?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
您是否知道防止在生成的 XML 中生成独立 =“yes”的 JAXB 设置?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
在作为 JDK1.6 一部分的 JAXB 中
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
这个性质:
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);
...可以用来没有:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
但是,我不会考虑这种最佳做法。
您可以使用
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
或者
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", 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,从而避免了Standalone="yes"属性。
只是如果其他人仍在努力解决这个问题,您可以考虑使用
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
String
删除所有 XML 声明,只需在输出流/方法的开头编写自己的声明
如果您使文档依赖于DOCTYPE
(例如使用命名实体),那么它将不再是独立的,因此standalone="yes"
在 XML 声明中是不允许的。
然而,独立的 XML 可以在任何地方使用,而非独立的 XML 解析器对于不加载外部的 XML 解析器来说是有问题的。
除了与不支持 XML 的软件的互操作性之外,我看不出这个声明如何成为问题,而是一些可怕的正则表达式汤。
如果您只使用默认的 javax.xml 包,您可以将 marshaller 的 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("jaxb.fragment", Boolean.TRUE);
它适用于 Java 8
我没有足够高的“声誉”来拥有评论的“特权”。;-)
@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
如果您遇到属性异常,请添加以下配置:
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlDeclaration", Boolean.FALSE);
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
你试一试
private String marshaling2(Object object) throws JAXBException, XMLStreamException {
JAXBContext jaxbContext = JAXBContext.newInstance(object.getClass());
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
StringWriter writer = new StringWriter();
writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
jaxbMarshaller.marshal(object, writer);
return writer.toString();
}
我正在使用 Java 1.8 和 JAXB 2.3.1
首先,确保在 pom.xml 中使用 java 1.8
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
然后在我使用的源代码中:(关键是内部部分)
// remove standalone=yes
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
如果你有<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
但想要这个:<?xml version="1.0" encoding="UTF-8"?>
做就是了:
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");