Dokument XML na ciąg

104

Jaki jest najprostszy sposób uzyskania reprezentacji ciągu dokumentu XML ( org.w3c.dom.Document)? Oznacza to, że wszystkie węzły będą znajdować się w jednej linii.

Na przykład z

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

(to jest tylko reprezentacja drzewa, w moim kodzie jest to org.w3c.dom.Documentobiekt, więc nie mogę traktować go jako String)

do

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

Dzięki!

niebieskawy
źródło

Odpowiedzi:

207

Zakładając, że docjest to Twój przypadek 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", "");
WhiteFang34
źródło
12
replaceAllprawdopodobnie nie jest konieczne, jeśli dodać inną nieruchomość wyjściowy:transformer.setOutputProperty(OutputKeys.INDENT, "no");
bvdb
10
a writer.getBuffer().toString()może po prostu byćwriter.toString()
bvdb
@bvdb oba doskonałe punkty. Istnieje dodatkowa zaleta jawnego dodawania OutputKeys.INDENTlinii, ponieważ wtedy możesz również ustawić ją tak, "yes"aby zachowywała białe znaki - jeśli tego chcesz (w mojej sytuacji odkryłem, że samo usunięcie replaceAllnie zadziałało, aby uwzględnić spacje w strunowy).
Jonathan Benn
Zobacz także stackoverflow.com/questions/1384802/…, aby uzyskać wyjaśnienie, jak sprawić, aby wcięcie działało poprawnie
Jonathan Benn
2

Użyj Apache XMLSerializer

oto przykład: http://www.informit.com/articles/article.asp?p=31349&seqNum=3&rl=1

możesz to również sprawdzić

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

GuruKulki
źródło
Xerces nadal, co śmieszne, nie jest oficjalnie rozprowadzane przez Maven (a więc również groovy), w tym nie ma wiarygodnego źródła ani JavaDocs, WTF! Żadne oficjalne wsparcie maven nie utrudnia rozwiązania problemu przestarzałego, sprawia, że ​​spójne aktualizacje są bardziej kłopotliwe i stwarza zagrożenie dla bezpieczeństwa, więc głupotą jest mieć teraz jakiekolwiek zależności od tego!
Infernoz
1

Najpierw musisz pozbyć się wszystkich znaków nowej linii we wszystkich węzłach tekstowych. Następnie możesz użyć transformacji tożsamości, aby wyświetlić drzewo DOM. Spójrz na javadoc dla TransformerFactory#newTransformer().

czterdzieści dwa
źródło