将XML注释添加到封送文件中

我正在将对象编组到XML文件中。 如何在该XML文件中添加注释?

我没有看到单独使用JAXB的方法。 但是,我认为您可以利用DOM来获得所需的效果:

final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); final DocumentBuilder builder = factory.newDocumentBuilder(); final Document doc = builder.getDOMImplementation().createDocument(null, null, null); final Binder binder = jaxbContext.createBinder(); binder.marshal(jaxbObject, doc); final Comment comment = doc.createComment("This is a comment"); doc.appendChild(comment); final DOMSource domSource = new DOMSource(doc); // use System.out for testing final StreamResult streamResult = new StreamResult(System.out); final TransformerFactory tf = TransformerFactory.newInstance(); final Transformer serializer = tf.newTransformer(); serializer.transform(domSource, streamResult); 

其中jaxbContext是您正在使用的JAXBContext对象,jaxbObject是要编组的对象。 此示例只是将注释附加到文档的末尾。 对于其他位置,您必须通过doc对象遍历DOM或使用XPath查找要添加注释的确切元素并在其上使用appendChild。

您可以使用专有的Marshaller属性com.sun.xml.bind.xmlHeaders在序言之后添加注释( 请参阅XML Preamble Control )

在包含的JAXB实现jdk1.6.0_29中,该属性称为“com.sun.xml.internal.bind.xmlHeaders”

另请参阅问题: 如何在使用JAXB进行编组时添加DOCTYPE和xml处理指令?

因此,在序言之后使用test-comment获取此XML:

    Daniel 1982-06-09T00:00:00+02:00  

您可以使用此Java代码:

 JAXBContext context = JAXBContext.newInstance(Player.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); m.setProperty("com.sun.xml.internal.bind.xmlHeaders", "\n"); m.marshal(player, System.out); 

如果现在有人这样做,就像我刚刚做的那样,值得指出的是,执行此操作的属性现在是com.sun.xml.bind.xmlHeaders (看起来不再是内部),所以你可以像这样解决问题(我只使用EclipseLink MOXY尝试过):

 JAXBContext context = JAXBContext.newInstance(Player.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); m.setProperty("com.sun.xml.bind.xmlHeaders", "\n"); m.marshal(player, System.out); 

以下信息最初来自jaxb.java.net上JAXB RI Extensions文档中的Marshaller Properties :

XML前导码控制

此属性允许您指定XML前导码(声明)以及其后的任何其他PI,注释,DOCTYPE声明。 只有在编组为OutputStream,Writer或StreamResult时,此属性才会生效。 请注意,此属性与Marshaller.JAXB_FRAGMENT属性进行交互。 如果该属性未被触及或设置为false,则JAXB将始终编写其XML前导码,因此此属性仅可用于编写PI,注释,DOCTYPE等。另一方面,如果将其设置为true,则JAXB不会编写自己的XML前导码,因此该属性可能包含自定义XML前导码。