Документ XML до рядка


104

Який найпростіший спосіб отримати струнне представлення XML-документа ( org.w3c.dom.Document)? Тобто всі вузли будуть в одному рядку.

Як приклад, від

<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не працювало, щоб включити пробіл у поле рядок).
Джонатан Бенн

Дивіться також stackoverflow.com/questions/1384802/… для пояснення, як змусити відступ працювати належним чином
Джонатан Бенн

2

Використовуйте Apache XMLSerializer

ось приклад: http://www.informit.com/articles/article.asp?p=31349&seqNum=3&rl=1

Ви також можете це перевірити

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


Смішно, Xerces досі офіційно не розповсюджується через Maven (таким чином, і дуже жорстокий), включаючи відсутність надійного джерела або JavaDocs, WTF! Жодна офіційна підтримка Maven не робить важче вирішення проблеми з амортизацією, робить більш постійними оновлення більше клопоту та створює ризики для безпеки, тому нерозумно зараз мати будь-які залежності від цього!
Інферноз

1

Спочатку потрібно позбутися всіх символів нового рядка у всіх своїх текстових вузлах. Тоді ви можете використовувати перетворення ідентичності для виведення вашого дерева DOM. Подивіться на javadoc для TransformerFactory#newTransformer().

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.