我正在将对象编组到XML文件中。如何在该XML文件中添加注释?
答案 0 :(得分:12)
您可以使用专有的Marshaller属性com.sun.xml.bind.xmlHeaders(see XML Preamble Control)
在序言之后添加注释在包含的JAXB实现jdk1.6.0_29中,该属性称为“com.sun.xml.internal.bind.xmlHeaders”
另请参阅问题:How to add DOCTYPE and xml processing instructions when marshalling with JAXB?
所以在序言之后用测试评论来获取这个XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Test Comment -->
<player>
<name>Daniel</name>
<birthday>1982-06-09T00:00:00+02:00</birthday>
</player>
您可以使用此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<!-- Test Comment -->");
m.marshal(player, System.out);
答案 1 :(得分:7)
我没有看到单独使用JAXB的方法。但是,我认为您可以利用DOM来获得所需的效果:
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
final DocumentBuilder builder = factory.newDocumentBuilder();
final Document doc = builder.getDOMImplementation().createDocument(null, null, null);
final Binder<Node> 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。
答案 2 :(得分:3)
如果现在有人这样做,就像我刚刚做的那样,值得指出的是,现在执行此操作的属性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<!-- Test Comment -->");
m.marshal(player, System.out);
以下信息最初来自Marshaller Properties JAXB RI Extensions文档中的jaxb.java.net:
XML前导码控制
此属性允许您指定XML前导码( 声明)和任何其他PI,评论,DOCTYPE声明 紧随其后。此属性仅在您使用时生效 编组到OutputStream,Writer或StreamResult。请注意这一点 property与Marshaller.JAXB_FRAGMENT属性进行交互。如果说 属性未触及或设置为false,然后JAXB将始终写入 它的XML前导码,所以这个属性只能用于编写PI, 注释,DOCTYPE等。另一方面,如果设置为true,那么 JAXB不会编写自己的XML前导码,因此该属性可能包含 自定义XML序言。