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!

bläulich
quelle

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", "");
WhiteFang34
quelle
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().

zweiundvierzig
quelle