文字列へのXMLドキュメント


104

XMLドキュメント(org.w3c.dom.Document)の文字列表現を取得する最も簡単な方法は何ですか?つまり、すべてのノードが1行になります。

例として、

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

(これは単なるツリー表現であり、私のコードではorg.w3c.dom.Documentオブジェクトなので、文字列として扱うことはできません)

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

ありがとう!



回答:


207

docあなたのインスタンスを仮定すると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
replaceAllあなたが別の出力特性を追加した場合、おそらく必要はありません:transformer.setOutputProperty(OutputKeys.INDENT, "no");
bvdb

10
そしてそれwriter.getBuffer().toString()はちょうどあり得るwriter.toString()
bvdb

@bvdb両方の優れた点。OutputKeys.INDENT行を明示的に追加することには特別な利点があります。"yes"空白を維持するように設定することもできるためです。それが必要な場合は(削除するだけでreplaceAllは空白を挿入しても機能しないことがわかりました)ストリング)。
ジョナサンベン2018年

インデントを適切に機能させる方法の説明については、stackoverflow.com / questions / 1384802 /…も参照してください
Jonathan Benn


1

まず、すべてのテキストノードのすべての改行文字を取り除く必要があります。次に、アイデンティティ変換を使用してDOMツリーを出力できます。のjavadocを参照してくださいTransformerFactory#newTransformer()

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.