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

Joh*_*rim 78 xml xsd jaxb xml-binding

您是否知道JAXB设置可以防止在生成的XML中生成standalone ="yes"

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Run Code Online (Sandbox Code Playgroud)

so_*_*_mv 118

在JAXB中,它是JDK1.6的一部分

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
Run Code Online (Sandbox Code Playgroud)

  • 这不会给出预期的结果.这将删除所有XML声明行.我想要的只是删除XML声明中的`standalone`属性. (11认同)

Sam*_*Sam 59

marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE);
Run Code Online (Sandbox Code Playgroud)

可以用来没有

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Run Code Online (Sandbox Code Playgroud)

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

  • 很好,它的工作原理,但FWIW服务如果不能接受合法的xml就会被破坏,所以提交一份bug报告可能会很好. (6认同)
  • 在JDK1.6中不适用于JAXB.请参阅so_mv的答案以获得正确的解决方案. (4认同)
  • 谢谢,这正是我所需要的.我同意最佳做法是包含该行,但我正在接口的Web服务并不期望它. (2认同)
  • 不再起作用(JDK1.8)。 (2认同)

War*_*Fox 57

你可以使用

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
Run Code Online (Sandbox Code Playgroud)

要么

marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE)
Run Code Online (Sandbox Code Playgroud)

禁用默认的XML声明,然后添加自定义XML声明,

<?xml version="1.0" encoding="UTF-8"?>
Run Code Online (Sandbox Code Playgroud)

通过

marshaller.setProperty("com.sun.xml.bind.xmlHeaders",
      "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
Run Code Online (Sandbox Code Playgroud)

到生成的xml,从而避免standalone ="yes"属性.

  • 带有"xmlDeclaration"的"setProperty"在飞行中爆炸:异常. (2认同)
  • 带有"xmlHeaders"的"setProperty"行也会失败.PropertyException.所以这不是一个解决方案. (2认同)
  • 无论java6还是java7,我都要添加'internal',即marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders","<?xml version = \"1.0 \"encoding = \"UTF-8\"?>"); (2认同)

ben*_*nez 6

如果其他人还在讨论这个问题,你可以考虑使用

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
Run Code Online (Sandbox Code Playgroud)

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


Kor*_*nel 5

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

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

除了与不支持 XML 但一些可怕的正则表达式汤的软件的互操作性之外,我看不出这个声明有什么问题。

  • 它以什么方式回答这个问题? (2认同)

小智 5

jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
Run Code Online (Sandbox Code Playgroud)

这对我的 JDK1.7 有用。standalone=\"no\" 可以删除以仅获取 xml 部分的其余部分


小智 5

如果您仅使用默认的 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();
Run Code Online (Sandbox Code Playgroud)