XML-Dokument in Zeichenfolge


104

Was ist der einfachste Weg, um die String-Darstellung eines XML-Dokuments zu erhalten?org.w3c.dom.Document ) zu erhalten? Das heißt, alle Knoten befinden sich in einer einzelnen Zeile.

Als Beispiel aus

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

(Dies ist nur eine Baumdarstellung, in meinem Code ist es ein org.w3c.dom.DocumentObjekt, daher kann ich es nicht als Zeichenfolge behandeln.)

zu

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

Vielen Dank!



Antworten:


207

Angenommen, docIhre Instanz ist 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
das replaceAllist wahrscheinlich nicht erforderlich , wenn Sie einen anderen Ausgang Eigenschaft hinzufügen:transformer.setOutputProperty(OutputKeys.INDENT, "no");
BvdB

10
und das writer.getBuffer().toString()kann nur seinwriter.toString()
bvdb

@bvdb beide hervorragenden Punkte. Das explizite Hinzufügen der OutputKeys.INDENTZeile bietet einen zusätzlichen Vorteil , da Sie sie dann auch so einstellen können, "yes"dass das Leerzeichen beibehalten wird - wenn Sie dies möchten (in meiner Situation habe ich festgestellt, dass das Entfernen replaceAlldes Leerzeichens nicht funktioniert, um das Leerzeichen in die Zeile aufzunehmen Zeichenfolge).
Jonathan Benn

Unter auch stackoverflow.com/questions/1384802/… finden Sie eine Erklärung, wie der Einzug ordnungsgemäß funktioniert
Jonathan Benn


1

Zuerst müssen Sie alle Zeilenumbrüche in all Ihren Textknoten entfernen. Anschließend können Sie eine Identitätstransformation verwenden, um Ihren DOM-Baum auszugeben. Schauen Sie sich den Javadoc an TransformerFactory#newTransformer().

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.