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 01

@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 затрудняет решение проблемы устаревания, усложняет согласованные обновления и создает риски для безопасности, поэтому глупо иметь какие-либо зависимости от него сейчас!
Infernoz

1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.