您是否了解JAXB设置以防止在生成的XML中生成 standalone =“yes”?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
答案 0 :(得分:117)
在JAXB中,它是JDK1.6的一部分
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
答案 1 :(得分:56)
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE);
可以用来没有
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
但我不会考虑这种最佳做法。
答案 2 :(得分:56)
您可以使用
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,从而避免 standalone =“yes”属性。
答案 3 :(得分:6)
如果其他人还在讨论这个问题,你可以考虑使用
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
删除所有XML声明,只在输出流/方法的开头编写自己的String
答案 4 :(得分:4)
如果您使文档依赖于DOCTYPE
(例如使用命名实体),那么它将不再是独立的,因此在XML声明中将不允许standalone="yes"
。
但是,可以在任何地方使用独立的XML,而非独立的XML对于不加载外部的XML解析器是有问题的。
我不知道这个声明如何成为一个问题,除了与不支持XML的软件的互操作性,还有一些可怕的正则表达式汤。
答案 5 :(得分:3)
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部分的其余部分
答案 6 :(得分:2)
如果您只使用默认的javax.xml包,则可以将编组器的JAXB_FRAGMENT选项设置为&#39; true&#39; (这省略了默认的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();
答案 7 :(得分:2)
您可以使用: marshaller.setProperty(“jaxb.fragment”,Boolean.TRUE);
它适用于Java 8
答案 8 :(得分: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)
如果我像你一样使用“internal”属性,我会得到一个 javax.xml.bind.PropertyException
答案 9 :(得分:0)
如果遇到属性异常,请添加以下配置:
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);
答案 10 :(得分:0)
尝试
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();
}
答案 11 :(得分:0)
我正在使用Java 1.8和JAXB 2.3.1
首先,请确保在pom.xml中使用Java 1.8
dict
然后在我使用的源代码中:(关键是内部部分)
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
答案 12 :(得分:0)
如果您有<?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\"?>");