Dokumen XML ke String

104

Apa cara termudah untuk mendapatkan representasi String dari XML Document ( org.w3c.dom.Document)? Artinya semua node akan berada dalam satu baris.

Sebagai contoh, dari

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

(ini hanya representasi pohon, dalam kode saya itu adalah org.w3c.dom.Documentobjek, jadi saya tidak bisa memperlakukannya sebagai String)

untuk

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

Terima kasih!

kebiruan
sumber

Jawaban:

207

Dengan asumsi docadalah contoh Anda dari 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", "");
WhiteFang 34
sumber
12
yang replaceAllmungkin tidak diperlukan jika Anda menambahkan properti output yang lain:transformer.setOutputProperty(OutputKeys.INDENT, "no");
bvdb
10
dan writer.getBuffer().toString()hanya bisawriter.toString()
bvdb
@bvdb kedua poin yang sangat baik. Ada keuntungan ekstra untuk menambahkan OutputKeys.INDENTbaris secara eksplisit , karena Anda juga dapat mengaturnya "yes"untuk mempertahankan spasi - jika itu yang Anda inginkan (dalam situasi saya, saya telah menemukan bahwa hanya menghapus replaceAlltidak berhasil untuk menyertakan spasi di tali).
Jonathan Benn
Lihat juga stackoverflow.com/questions/1384802/… untuk penjelasan tentang cara membuat indentasi berfungsi dengan benar
Jonathan Benn
2

Gunakan Apache XMLSerializer

inilah contohnya: http://www.informit.com/articles/article.asp?p=31349&seqNum=3&rl=1

Anda bisa memeriksanya juga

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

GuruKulki
sumber
Xerces masih, konyolnya, tidak secara resmi mendistribusikan melalui Maven (jadi asyik juga), termasuk tidak ada sumber terpercaya atau JavaDocs, WTF! Tidak ada dukungan resmi maven yang mempersulit penyelesaian penghentian, membuat pembaruan yang konsisten lebih merepotkan, dan menimbulkan risiko keamanan, jadi bodoh jika memiliki ketergantungan padanya sekarang!
Infernoz
1

Pertama, Anda perlu menyingkirkan semua karakter baris baru di semua node teks Anda. Kemudian Anda dapat menggunakan transformasi identitas untuk mengeluarkan pohon DOM Anda. Lihat javadoc untuk TransformerFactory#newTransformer().

empat puluh dua
sumber