Documento XML in stringa


104

Qual è il modo più semplice per ottenere la rappresentazione in formato stringa di un documento XML ( org.w3c.dom.Document)? Cioè tutti i nodi saranno su una singola riga.

Ad esempio, da

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

(questa è solo una rappresentazione ad albero, nel mio codice è un org.w3c.dom.Documentoggetto, quindi non posso trattarlo come una stringa)

per

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

Grazie!



Risposte:


207

Supponendo che docsia la tua istanza di 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
il replaceAllè probabilmente non è necessario se si aggiunge un'altra proprietà di uscita:transformer.setOutputProperty(OutputKeys.INDENT, "no");
bvdb

10
e writer.getBuffer().toString()può essere solowriter.toString()
bvdb

@ bvdb entrambi ottimi punti. C'è un vantaggio in più nell'aggiungere esplicitamente la OutputKeys.INDENTlinea, perché poi puoi anche impostarlo "yes"per mantenere gli spazi bianchi - se è quello che vuoi (nella mia situazione ho scoperto che la semplice rimozione replaceAllnon ha funzionato per includere lo spazio bianco nel corda).
Jonathan Benn

Vedi anche stackoverflow.com/questions/1384802/… per una spiegazione su come far funzionare correttamente il rientro
Jonathan Benn

2

Usa Apache XMLSerializer

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

puoi controllare anche questo

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


Xerces sta ancora, ridicolmente, non distribuendo ufficialmente tramite Maven (quindi anche groovy), includendo nessuna fonte affidabile o JavaDocs, WTF! Nessun supporto tecnico ufficiale rende più difficile la risoluzione della deprecazione, rende gli aggiornamenti coerenti più fastidiosi e pone rischi per la sicurezza, quindi è stupido avere delle dipendenze da esso ora!
Infernoz il

1

Per prima cosa devi sbarazzarti di tutti i caratteri di nuova riga in tutti i tuoi nodi di testo. Quindi puoi usare una trasformazione di identità per generare il tuo albero DOM. Guarda il javadoc per TransformerFactory#newTransformer().

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.