您是否知道防止在结果XML中生成Standalone =“ yes”的JAXB设置?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
您是否知道防止在结果XML中生成Standalone =“ yes”的JAXB设置?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Answers:
这个性质:
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);
...可以用来没有:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
但是,我不会考虑这种最佳做法。
在JDK1.6中的JAXB中
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
standalone
XML声明中的属性。
您可以使用
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”属性。
如果使文档依赖DOCTYPE
(例如使用命名实体),它将停止独立运行,因此standalone="yes"
XML声明中将不允许使用该文档。
然而,独立的XML可以在任何地方使用,而非独立的XML对于不加载外部数据的XML解析器是有问题的。
除了与不支持XML的软件的互操作性外,我看不到该声明怎么会成为问题,而是一些可怕的正则表达式。
DOCTYPE
?
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部分
如果仅使用默认的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();
您可以使用:marshaller.setProperty(“ jaxb.fragment”,Boolean.TRUE);
它在Java 8上对我有效
如果您遇到属性异常,请添加以下配置:
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);
我正在使用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\"?>");
你试一试
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();
}