83

您是否知道防止在生成的 XML 中生成独立 =“yes”的 JAXB 设置?

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

13 回答 13

121

在作为 JDK1.6 一部分的 JAXB 中

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
于 2010-11-01T08:27:51.080 回答
66

这个性质:

marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);

...可以用来没有:

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

但是,我不会考虑这种最佳做法。

于 2008-12-09T08:26:54.267 回答
64

您可以使用

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"属性。

于 2011-03-25T11:00:29.150 回答
7

只是如果其他人仍在努力解决这个问题,您可以考虑使用

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);

String删除所有 XML 声明,只需在输出流/方法的开头编写自己的声明

于 2016-11-07T12:13:36.077 回答
5

如果您使文档依赖于DOCTYPE(例如使用命名实体),那么它将不再是独立的,因此standalone="yes"在 XML 声明中是不允许的。

然而,独立的 XML 可以在任何地方使用,而非独立的 XML 解析器对于不加载外部的 XML 解析器来说是有问题的。

除了与不支持 XML 的软件的互操作性之外,我看不出这个声明如何成为问题,而是一些可怕的正则表达式汤。

于 2008-12-24T10:51:09.693 回答
4

如果您只使用默认的 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();
于 2017-05-03T09:55:07.800 回答
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 部分的其余部分

于 2016-08-10T11:40:45.647 回答
2

您可以使用: marshaller.setProperty("jaxb.fragment", Boolean.TRUE);

它适用于 Java 8

于 2018-04-10T17:46:23.003 回答
1

我没有足够高的“声誉”来拥有评论的“特权”。;-)

@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

于 2016-09-21T23:34:00.387 回答
1

如果您遇到属性异常,请添加以下配置:

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);  
于 2019-02-10T19:33:59.190 回答
1

你试一试

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();
  }
于 2019-08-06T18:56:28.043 回答
1

我正在使用 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\"?>");
于 2019-11-27T01:44:20.347 回答
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\"?>");
于 2020-03-20T12:28:54.717 回答