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!

azulado
fuente
Imitación de stackoverflow.com/questions/315517/…
james.garriss

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", "");
WhiteFang34
fuente
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

GuruKulki
fuente
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().

cuarenta y dos
fuente