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


82

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

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

7
为什么会有问题呢?
Kornel

@Kornel在我的项目,要得到与TIBCO和使用的WebMethod,因为独立= yes,则无法识别它会产生错误
aswzen

Answers:


62

这个性质:

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

...可以用来没有:

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

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


2
谢谢,这正是我所需要的。我同意包括这行是最佳实践,但是与我连接的Web服务并不期望这样做。
jgrowl

6
可以正常工作,但是如果不能接受合法的xml,则FWIW服务会中断,因此针对它提交错误报告可能是好的。
StaxMan

4
在JDK1.6中不适用于JAXB。有关正确的解决方案,请参见so_mv的答案。
sversch

1
在飞行中爆炸:异常。
Nicolas Barbulesco

1
@sversch:您可以尝试属性类:“ com.sun.xml.internal.bind.xmlHeaders”
baybora.oren 2013年

120

在JDK1.6中的JAXB中

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

13
这不会给出预期的结果。这将删除所有XML声明行。我想要的只是删除standaloneXML声明中的属性。
Nicolas Barbulesco

如果您想知道为什么像我一样对您不起作用,那么答案是效果取决于您使用的元帅api。对于marshal(Object,Outputstream)和marshal(Object,Writer),此操作如此处建议的那样。对于marshal(Object,Node)无效。对于其余的编组API的意义看看这里下所支持的属性部分。
Lasse Samson

59

您可以使用

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


2
带有“ xmlDeclaration”的“ setProperty”在飞行中爆炸:异常。
Nicolas Barbulesco

2
“ xmlHeaders”的“ setProperty”行也失败。PropertyException。因此,这不是解决方案。
Nicolas Barbulesco

您正在使用哪个版本的Java和jaxb?
WarFox

@WarFox setProperty with xmlHeaders命令不适用于jdk1.6.0_24和JAXB 2.1版
Bryan Larson

3
无论使用Java6还是Java7,我都必须添加“内部”,即marshaller.setProperty(“ com.sun.xml.internal.bind.xmlHeaders”,“ <?xml version = \” 1.0 \“ encoding = \” UTF-8 \“?>”);
Caoilte 2014年

7

即使其他人仍在努力解决此问题,您也可以考虑使用

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

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


5

如果使文档依赖DOCTYPE(例如使用命名实体),它将停止独立运行,因此standalone="yes"XML声明中将不允许使用该文档。

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

除了与不支持XML的软件的互操作性外,我看不到该声明怎么会成为问题,而是一些可怕的正则表达式。


1
确实,任何在xml声明上bar倒的据称xml处理系统似乎都是高度可疑的。
StaxMan 2011年

1
它以什么方式回答问题?
ᄂ 2014年

如何使文件依赖DOCTYPE

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部分


1
错误:javax.xml.bind.PropertyException:名称:com.sun.xml.internal.bind.xmlHeaders值:<?xml version =“ 1.0” encoding =“ UTF-8”?>
aswzen

3

如果仅使用默认的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();


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


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

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

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

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\"?>");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.