2009-08-28 23 views
15

Estoy ordenando objetos en un archivo XML. ¿Cómo puedo agregar comentarios en ese archivo XML?Agregar comentarios XML en el archivo marshaled

+1

Por si alguien está manejando JAXB está escuchando - en segundo lugar la necesidad de agregar comentarios (y líneas nuevas para impresión bonita), es decir, la necesidad de insertar nodos en el árbol DOM durante la clasificación. – Stroboskop

Respuesta

6

No veo la manera de hacerlo solo con JAXB. Sin embargo, creo que se puede aprovechar DOM para obtener el efecto deseado:

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); 

Dónde JAXBContext es la JAXBContext objeto que está trabajando y jaxbObject es el objeto a ser movilizados. Esta muestra simplemente agrega el comentario al final del documento. Para una ubicación diferente, debe atravesar el DOM a través del objeto doc o usar XPath para encontrar el elemento exacto al que desea que se agregue el comentario y usar appendChild en él.

12

Se pueden añadir comentarios inmediatamente después de la exposición de motivos con los propietarios com.sun.xml.bind.xmlHeaders Marshaller propiedad (see XML Preamble Control)

En el JAXB-implementación que se incluye jdk1.6.0_29 la propiedad se llama "com. sun.xml.internal.bind.xmlHeaders"

Véase también la pregunta: How to add DOCTYPE and xml processing instructions when marshalling with JAXB?

Así que para conseguir este XML con la prueba de comentario después de la exposición de motivos:

<?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> 

Puede utilizar esta Java Código:

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

No funciona con jaxb-impl-2.2.6-b35, el setProperty ("com.sun.xml.internal.bind.xmlHeaders", ...) falla con PropertyException –

+0

@MartinVysny consider com.sun.xml.internal .bind.xmlHeaders – Woot4Moo

3

Si alguno viene a esto ahora, al igual que acabo de hacer, vale la pena señalar que la propiedad de hacer esto es ahora com.sun.xml.bind.xmlHeaders (no interna parece), por lo que puede resolver el problema como este (solo he probado con 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); 

la siguiente información proviene originalmente de Marshaller Properties en la documentación JAXB RI Extensions en jaxb.java.net:

control Preámbulo XML

Esta propiedad le permite especificar un preámbulo XML ( declaración) y cualquier adicional de inhibidores de la proteasa, comentarios, declaración DOCTYPE que le sigue. Esta propiedad tiene efecto solo cuando está clasificándose en OutputStream, Writer o StreamResult. Tenga en cuenta que esta propiedad interactúa con la propiedad Marshaller.JAXB_FRAGMENT. Si esa propiedad no se modifica o se configura como falsa, JAXB siempre escribirá su preámbulo XML, por lo que esta propiedad solo se puede usar para escribir PI, comentarios, DOCTYPE, etc. Por otro lado, si está configurado como verdadero , entonces JAXB no escribirá su propio preámbulo de XML, por lo que esta propiedad puede contener preámbulo de XML personalizado.

Cuestiones relacionadas