Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将XML注释添加到封送文件中_Java_Xml_Jaxb - Fatal编程技术网

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

Java 将XML注释添加到封送文件中,java,xml,jaxb,Java,Xml,Jaxb,我正在将对象封送到XML文件中。如何将注释添加到该XML文件中?我看不到单独使用JAXB的方法。但是,我认为您可以利用DOM获得所需的效果: final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); final DocumentBuilder builder = factory.newDocumentBuilder(); final Document doc = builder.getDOMImple

我正在将对象封送到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<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);
final DocumentBuilderFactory=DocumentBuilderFactory.newInstance();
final DocumentBuilder=factory.newDocumentBuilder();
最终文档doc=builder.getDOMImplementation().createDocument(null,null,null);
final Binder=jaxbContext.createBinder();
binder.marshal(jaxbObject,doc);
最终评论评论=doc.createComment(“这是一条评论”);
文件附录(注释);
最终DOMSource DOMSource=新DOMSource(doc);
//使用System.out进行测试
最终StreamResult=新的StreamResult(System.out);
final TransformerFactory tf=TransformerFactory.newInstance();
最终变压器序列化器=tf.newTransformer();
transform(domSource、streamResult);

其中,jaxbContext是您正在使用的jaxbContext对象,jaxbObject是要封送的对象。此示例仅将注释附加到文档末尾。对于另一个位置,您必须通过doc对象遍历DOM,或者使用XPath找到要添加注释的确切元素,并在其上使用appendChild。

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

在附带的JAXB实现jdk1.6.029中,该属性称为“com.sun.xml.internal.bind.xmlHeaders”

另见问题:

因此,要获得序言后面带有测试注释的XML:


丹尼尔
1982-06-09T00:00:00+02:00
您可以使用以下Java代码:

JAXBContext context=JAXBContext.newInstance(Player.class);
Marshaller m=context.createMarshaller();
m、 setProperty(Marshaller.JAXB_格式的_输出,Boolean.TRUE);
m、 setProperty(“com.sun.xml.internal.bind.xmlHeaders”,“\n”);
m、 元帅(球员,系统出局);

如果现在有人像我刚才那样提到这一点,那么值得指出的是,执行此操作的属性现在是
com.sun.xml.bind.xmlHeaders
(看起来不再是内部的),因此您可以像这样解决问题(我只在EclipseLink MOXY中尝试过):

JAXBContext context=JAXBContext.newInstance(Player.class);
Marshaller m=context.createMarshaller();
m、 setProperty(Marshaller.JAXB_格式的_输出,Boolean.TRUE);
m、 setProperty(“com.sun.xml.bind.xmlHeaders”,“\n”);
m、 元帅(球员,系统出局);
以下信息最初来自以下文件:

XML前导控制

此属性允许您指定XML前导( 声明)和任何附加的PI、注释、DOCTYPE声明 接下来就是。此属性仅在您 编组到OutputStream、Writer或StreamResult。请注意 属性与Marshaller.JAXB_片段属性交互。如果 属性未被触及或设置为false,则JAXB将始终写入 它的XML前导,因此此属性只能用于编写PI, 注释、DOCTYPE等。另一方面,如果设置为true,则 JAXB不会编写自己的XML前导,因此此属性可能包含 自定义XML序言


以防管理JAXB的人正在侦听—我支持添加注释(以及用于漂亮打印的换行符)的需要,即在编组期间将节点插入DOM树的需要。不适用于JAXB-impl-2.2.6-b35,setProperty(“com.sun.xml.internal.bind.xmlHeaders”,…)失败于PropertyException@MartinVysny考虑.Mun.Sun.xML.Intual.BID.XMLHead
<?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>
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);
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);