Documento XML a cadena


104

¿Cuál es la forma más sencilla de obtener la representación de cadena de un documento XML ( org.w3c.dom.Document)? Es decir, todos los nodos estarán en una sola línea.

Como ejemplo, de

<root>
  <a>trge</a>
  <b>156</b>
</root>

(esto es solo una representación de árbol, en mi código es un org.w3c.dom.Documentobjeto, por lo que no puedo tratarlo como una cadena)

a

"<root> <a>trge</a> <b>156</b> </root>"

¡Gracias!



Respuestas:


207

Suponiendo que doces su instancia de org.w3c.dom.Document:

TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(writer));
String output = writer.getBuffer().toString().replaceAll("\n|\r", "");

12
el replaceAllprobablemente no es necesario si se agrega otra propiedad de salida:transformer.setOutputProperty(OutputKeys.INDENT, "no");
bvdb

10
y writer.getBuffer().toString()simplemente puede serwriter.toString()
bvdb

@bvdb ambos puntos excelentes. Hay una ventaja adicional al agregar explícitamente la OutputKeys.INDENTlínea, porque entonces también puede configurarlo "yes"para mantener el espacio en blanco, si eso es lo que desea (en mi situación, descubrí que simplemente eliminar replaceAllno funcionó para incluir el espacio en blanco en el cuerda).
Jonathan Benn

Consulte también stackoverflow.com/questions/1384802/… para obtener una explicación de cómo hacer que la sangría funcione correctamente
Jonathan Benn

2

Utilice Apache XMLSerializer

aquí hay un ejemplo: http://www.informit.com/articles/article.asp?p=31349&seqNum=3&rl=1

también puedes comprobar esto

http://www.netomatix.com/XmlFileToString.aspx


Xerces todavía, ridículamente, no se distribuye oficialmente a través de Maven (por lo tanto, también es genial), incluida una fuente confiable o JavaDocs, ¡WTF! Ningún soporte oficial de Maven dificulta la resolución de la desaprobación, hace que las actualizaciones consistentes sean más complicadas y plantea riesgos de seguridad, por lo que es estúpido tener dependencias de él ahora.
Infernoz hace

1

Primero necesita deshacerse de todos los caracteres de nueva línea en todos sus nodos de texto. Luego, puede usar una transformación de identidad para generar su árbol DOM. Mira el javadoc para TransformerFactory#newTransformer().

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.