2009-08-28 2 views
15

Я марширую объекты в XML-файл. Как добавить комментарии в этот XML-файл?Добавить комментарии XML в маршалированный файл

+1

На всякий случай кто-то, управляющий JAXB, слушает - во-вторых, необходимо добавить комментарии (и новые строки для печати), то есть необходимость вставлять узлы в дерево DOM во время сортировки. – Stroboskop

ответ

6

Я не вижу способа сделать это только с 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 является объектом быть ранжированы. Этот пример просто добавляет комментарий в конец документа. В другом месте вам нужно будет пересечь DOM через объект doc или использовать XPath, чтобы найти точный элемент, который вы хотите добавить комментарий, и использовать на нем appendChild.

12

комментариев Вы можете добавить сразу после преамбулы с фирменным com.sun.xml.bind.xmlHeaders собственности ИАСА (see XML Preamble Control)

В прилагаемом JAXB-реализации jdk1.6.0_29 свойства называется «ком. 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

Не работает с jaxb-impl-2.2.6-b35, setProperty ("com.sun.xml.internal.bind.xmlHeaders", ...) не работает с PropertyException –

+0

@MartinVysny рассматривает com.sun.xml.internal .bind.xmlHeaders – Woot4Moo

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 преамбулу ( декларация) и любые дополнительные PIs, комментарии, DOCTYPE декларацию , что следует за ним. Это свойство вступает в силу только тогда, когда вы находитесь , сортируя по OutputStream, Writer или StreamResult. Обратите внимание, что это свойство взаимодействует с свойством Marshaller.JAXB_FRAGMENT. Если это свойство не затронуто или установлено в false, тогда JAXB всегда будет писать своей преамбулой XML, поэтому это свойство можно использовать только для написания PI, комментариев, DOCTYPE и т. Д. С другой стороны, если для него установлено значение true , затем JAXB не будет писать собственную преамбулу XML, поэтому это свойство может содержать пользовательскую XML-преамбулу .

Смежные вопросы