Quando eu construo XML do zero XmlDocument
, a OuterXml
propriedade já tem tudo muito bem recuado com quebras de linha. No entanto, se eu chamar LoadXml
algum XML muito "compactado" (sem quebras de linha ou recuo), a saída de OuterXml
permanecerá dessa forma. Assim ...
Qual é a maneira mais simples de obter uma saída XML embelezada de uma instância de XmlDocument
?
c#
.net
xmldocument
outerxml
Neil C. Obremski
fonte
fonte
settings.Encoding = Encoding.UTF8;
MemoryStream
+StreamWriter
com uma codificação especificada em vez deStringBuilder
, e obtendo o texto comenc.GetString(memstream.GetBuffer(), 0, (int)memstream.Length);
. O resultado final ainda não está formatado de forma alguma. Será que estou partindo de um documento lido que já tem formatação? Eu só quero que meus novos nós sejam formatados também."\r\n"
paraEnvironment.Newline
.doc.PreserveWhitespace
não deve ser definido como verdadeiro. Caso contrário, ele falhará se já contiver recuo parcial.Conforme adaptado do blog de Erika Ehrli , isso deve bastar :
fonte
using
instrução fechará automaticamente o escritor quandoDispose()
for chamado.Ou ainda mais fácil se você tiver acesso ao Linq
fonte
<?xml ...?>
e o<!DOCTYPE ...>
do XML. OK para um fragmento, mas não desejável para um documento completo.Uma versão de método de extensão mais curta
fonte
Se o método Beautify acima estiver sendo chamado para um
XmlDocument
que já contém umXmlProcessingInstruction
nó filho, a seguinte exceção é lançada:Esta é minha versão modificada da original para me livrar da exceção:
Funciona para mim agora, provavelmente você precisaria verificar todos os nós filhos para o
XmlProcessingInstruction
nó, não apenas o primeiro?Atualização em abril de 2015:
Como tive outro caso em que a codificação estava errada, procurei como aplicar o UTF-8 sem BOM. Encontrei esta postagem do blog e criei uma função com base nela:
fonte
Encoding = Encoding.UTF8
eOmitXmlDeclaration = true
fonte
fonte
Uma maneira simples é usar:
Como este código de amostra, este código é o que eu usei para criar uma estrutura em forma de árvore usando XMLWriter:
Desta forma, você pode adicionar quebras de tabulação ou linha da maneira que está acostumado, ou seja, \ t ou \ n
fonte
Ao implementar as sugestões postadas aqui, tive problemas com a codificação do texto. Parece que a codificação de
XmlWriterSettings
é ignorada e sempre substituída pela codificação do fluxo. Ao usar umStringBuilder
, esta é sempre a codificação de texto usada internamente em C #, ou seja, UTF-16.Portanto, aqui está uma versão que também oferece suporte a outras codificações.
NOTA IMPORTANTE: A formatação é completamente ignorada se o seu
XMLDocument
objetopreserveWhitespace
estiver com sua propriedade habilitada ao carregar o documento. Isso me deixou perplexo por um tempo, então certifique-se de não habilitar isso.Meu código final:
Isso salvará o xml formatado no disco, com a codificação de texto fornecida.
fonte
Se você tiver uma string de XML, em vez de um documento pronto para uso, pode fazer desta forma:
fonte
Uma abordagem mais simplificada com base na resposta aceita:
Não é necessário definir a nova linha. Caracteres de recuo também têm os dois espaços padrão, portanto, preferi não defini-los também.
fonte