Documento XML para String

104

Qual é a maneira mais simples de obter a representação String de um Documento XML ( org.w3c.dom.Document)? Ou seja, todos os nós estarão em uma única linha.

Por exemplo, de

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

(esta é apenas uma representação em árvore, no meu código é um org.w3c.dom.Documentobjeto, então não posso tratá-lo como uma String)

para

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

Obrigado!

azulado
fonte

Respostas:

207

Supondo que docseja sua instância 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
fonte
12
o replaceAllProvavelmente não é necessário se você adicionar outra propriedade de saída:transformer.setOutputProperty(OutputKeys.INDENT, "no");
bvdb
10
e writer.getBuffer().toString()pode ser apenaswriter.toString()
bvdb 01 de
@bvdb ambos os pontos excelentes. Há uma vantagem extra em adicionar explicitamente a OutputKeys.INDENTlinha, porque então você também pode configurá-la para "yes"manter o espaço em branco - se for isso que você deseja (na minha situação, descobri que apenas remover replaceAllnão funcionou para incluir o espaço em branco no corda).
Jonathan Benn
Consulte também stackoverflow.com/questions/1384802/… para uma explicação de como fazer o recuo funcionar corretamente
Jonathan Benn,
2

Use o Apache XMLSerializer

aqui está um exemplo: http://www.informit.com/articles/article.asp?p=31349&seqNum=3&rl=1

você pode verificar isso também

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

GuruKulki
fonte
O Xerces ainda está, ridiculamente, não distribuindo oficialmente via Maven (portanto, também é bacana), incluindo nenhuma fonte confiável ou JavaDocs, WTF! Nenhum suporte oficial do maven torna a resolução de depreciação mais difícil, torna as atualizações consistentes mais incômodas e apresenta riscos de segurança, então é estúpido ter dependências nele agora!
Infernoz
1

Primeiro você precisa se livrar de todos os caracteres de nova linha em todos os nós de texto. Em seguida, você pode usar uma transformação de identidade para gerar sua árvore DOM. Olhe para o javadoc para TransformerFactory#newTransformer().

quarenta e dois
fonte