从生成的XML中删除“独立=‘是’”

问题描述 投票:75回答:10

你知道JAXB设置,以防止独立=“是”从生成的XML生成?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
xml xsd jaxb xml-binding
10个回答
57
投票
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE);

可用于无

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

不过,我难道不认为这是最好的做法。


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)

如果我用的是“内部”属性像你一样,我得到一个javax.xml.bind.PropertyException


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();
  }

117
投票

在JAXB是JDK1.6的一部分

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

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,从而避免了独立=“是”属性。


6
投票

只是如果有人仍然与这个问题所困扰,你可以考虑使用

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

删除所有的XML声明的,只是写自己的String你的输出流/方法的开始


4
投票

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

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

我没有看到这个声明会如何是一个问题,比与不支持XML软件的互操作性等,但一些可怕的正则表达式汤。


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。独立= \“无\”可以拆下来获取XML部分只休息


2
投票

如果您仅使用默认javax.xml包,你可以设置编组为“真”的JAXB_FRAGMENT选项(这忽略了默认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();

2
投票

你可以使用:marshaller.setProperty( “jaxb.fragment”,Boolean.TRUE);

它为我关于Java 8


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);  
© www.soinside.com 2019 - 2024. All rights reserved.