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>"

Спасибо!

голубоватый
источник
Контратип stackoverflow.com/questions/315517/...
james.garriss
iandjava.blogspot.in/2013/06/…
Ашиш Аггарвал

Ответы:

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", "");
БелыйКлык34
источник
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().

сорок два
источник