java - what - xml versiones
Formateo StAX XML en Java (9)
¿Es posible usar StAX (específicamente woodstox) para formatear el xml de salida con nuevas líneas y pestañas, es decir, en la forma:
<element1> <element2> someData </element2> </element1>
en lugar de:
<element1><element2>someData</element2></element1>
Si esto no es posible en woodstox, ¿hay otras libs livianas que puedan hacer esto?
Si está utilizando el método iterativo (XMLEventReader), ¿no puede adjuntar un nuevo carácter de línea ''/ n'' a los eventos XMLE relevantes al escribir en su archivo XML?
Hay com.sun.xml.txw2.output.IndentingXMLStreamWriter
XMLOutputFactory xmlof = XMLOutputFactory.newInstance();
XMLStreamWriter writer = new IndentingXMLStreamWriter(xmlof.createXMLStreamWriter(out));
En lugar de confiar en una clase com.sun ... que podría desaparecer (o ser renombrada com.oracle ... class), recomiendo descargar las clases de utilidad StAX de java.net. Este paquete contiene una clase IndentingXMLStreamWriter que funciona bien. (Source y javadoc están incluidos en la descarga).
Con Spring Batch esto requiere una subclase ya que este JIRA BATCH-1867
public class IndentingStaxEventItemWriter<T> extends StaxEventItemWriter<T> {
@Setter
@Getter
private boolean indenting = true;
@Override
protected XMLEventWriter createXmlEventWriter( XMLOutputFactory outputFactory, Writer writer) throws XMLStreamException {
if ( isIndenting() ) {
return new IndentingXMLEventWriter( super.createXmlEventWriter( outputFactory, writer ) );
}
else {
return super.createXmlEventWriter( outputFactory, writer );
}
}
}
Pero esto requiere una dependencia adicional porque Spring Batch no incluye el código para sangrar la salida de StAX:
<dependency>
<groupId>net.java.dev.stax-utils</groupId>
<artifactId>stax-utils</artifactId>
<version>20070216</version>
</dependency>
Si está utilizando la API de cursor de StAX, puede sangrar la salida envolviendo el XMLStreamWriter en un proxy de sangrado . Intenté esto en mi propio proyecto y funcionó muy bien.
A través del JDK: transformer.setOutputProperty(OutputKeys.INDENT, "yes");
.
Usando el transformador JDK:
public String transform(String xml) throws XMLStreamException, TransformerException
{
Transformer t = TransformerFactory.newInstance().newTransformer();
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
Writer out = new StringWriter();
t.transform(new StreamSource(new StringReader(xml)), new StreamResult(out));
return out.toString();
}
No estoy seguro sobre el stax, pero hubo una discusión reciente sobre la impresión bonita xml aquí
este fue mi intento de una solución
¿Cómo imprimir bastante XML desde Java?
utilizando el método org.dom4j.io.OutputFormat.createPrettyPrint ()
¿Qué hay de StaxMate :
http://www.cowtowncoder.com/blog/archives/2006/09/entry_21.html
Funciona bien con Woodstox, el uso rápido y con poca memoria (sin árbol incorporado en la memoria) y las sangrías de esta manera:
SMOutputFactory sf = new SMOutputFactory(XMLOutputFactory.newInstance());
SMOutputDocument doc = sf.createOutputDocument(new FileOutputStream("output.xml"));
doc.setIndentation("/n ", 1, 2); // for unix linefeed, 2 spaces per level
// write doc like:
SMOutputElement root = doc.addElement("element1");
root.addElement("element2").addCharacters("someData");
doc.closeRoot(); // important, flushes, closes output