Document XML en chaîne

104

Quel est le moyen le plus simple d'obtenir la représentation String d'un document XML ( org.w3c.dom.Document)? C'est-à-dire que tous les nœuds seront sur une seule ligne.

À titre d'exemple, de

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

(ce n'est qu'une représentation arborescente, dans mon code c'est un org.w3c.dom.Documentobjet, donc je ne peux pas le traiter comme une chaîne)

à

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

Merci!

bleuâtre
la source

Réponses:

207

En supposant que docvotre instance de 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
la source
12
ce replaceAlln'est probablement pas nécessaire si vous ajoutez une autre propriété de sortie:transformer.setOutputProperty(OutputKeys.INDENT, "no");
bvdb
10
and the writer.getBuffer().toString()can just bewriter.toString()
bvdb
@bvdb deux excellents points. Il y a un avantage supplémentaire à ajouter explicitement la OutputKeys.INDENTligne, car vous pouvez également la définir "yes"pour conserver l'espace blanc - si c'est ce que vous voulez (dans ma situation, j'ai trouvé que la simple suppression replaceAllne fonctionnait pas pour inclure l'espace blanc dans le chaîne).
Jonathan Benn
Voir aussi stackoverflow.com/questions/1384802/… pour une explication sur la façon de faire fonctionner correctement le retrait
Jonathan Benn
2

Utiliser le XMLSerializer Apache

voici un exemple: http://www.informit.com/articles/article.asp?p=31349&seqNum=3&rl=1

vous pouvez vérifier cela aussi

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

GuruKulki
la source
Xerces ne distribue toujours pas officiellement via Maven (donc groovy aussi), y compris aucune source fiable ou JavaDocs, WTF! Aucun support officiel de maven ne rend la résolution de la dépréciation plus difficile, rend les mises à jour cohérentes plus compliquées et pose des risques pour la sécurité, il est donc stupide d'avoir des dépendances dessus maintenant!
Infernoz
1

Vous devez d'abord vous débarrasser de tous les caractères de nouvelle ligne dans tous vos nœuds de texte. Ensuite, vous pouvez utiliser une transformation d'identité pour générer votre arborescence DOM. Regardez le javadoc pour TransformerFactory#newTransformer().

quarante-deux
la source