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

Ole*_*ndr 16 java xml jaxb

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

Dan*_*tar 12

您可以使用专有的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:

<?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>
Run Code Online (Sandbox Code Playgroud)

您可以使用此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);
Run Code Online (Sandbox Code Playgroud)


laz*_*laz 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);
Run Code Online (Sandbox Code Playgroud)

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


kmp*_*kmp 6

如果现在有人像我一样遇到这个问题,那么值得指出的是,执行此操作的属性现在是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);
Run Code Online (Sandbox Code Playgroud)

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

XML 前导码控制

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