Добавить XML-комментарии в маршалированный файл - PullRequest
16 голосов
/ 28 августа 2009

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

Ответы [ 3 ]

12 голосов
/ 01 февраля 2012

Вы можете добавлять комментарии сразу после преамбулы с помощью собственного свойства Marshaller com.sun.xml.bind.xmlHeaders ( см. Управление преамбулой XML )

Во включенной JAXB-реализации jdk1.6.0_29 свойство называется "com.sun.xml.internal.bind.xmlHeaders"

См. Также вопрос: Как добавить инструкции обработки DOCTYPE и xml при сортировке с помощью 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);
7 голосов
/ 29 августа 2009

Я не вижу способа сделать это с одним 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 для него.

3 голосов
/ 13 ноября 2015

Если кто-то придет к этому сейчас, как я только что сделал, стоит указать, что свойство сделать это теперь 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 в Расширениях JAXB RI в документации jaxb.java.net :

Управление преамбулой XML

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...