ws3 what versiones ultima school creador and java xml formatting stax woodstox

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



¿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