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!



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", "");

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


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().

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.