簡體   English   中英

將XML注釋添加到封送文件中

[英]Add XML comments into marshaled file

我正在將對象編組到XML文件中。 如何在該XML文件中添加注釋?

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

您可以使用此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);

我沒有看到單獨使用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。

如果現在有人這樣做,就像我剛剛做的那樣,值得指出的是,執行此操作的屬性現在是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);

以下信息最初來自於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前導碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM