从生成的XML中删除'standalone =“yes”'

时间:2008-11-10 14:32:59

标签: xml xsd jaxb xml-binding

您是否了解JAXB设置以防止在生成的XML中生成 standalone =“yes”

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

13 个答案:

答案 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\"?>");