Conversão XmlDocument para String


218

Aqui está como atualmente estou convertendo XMLDocument para String

StringWriter stringWriter = new StringWriter();
XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter);

xmlDoc.WriteTo(xmlTextWriter);

return stringWriter.ToString();

O problema com esse método é que, se eu tiver " ((aspas) que tenho em atributos), ele os escapará.

Por exemplo:

<Campaign name="ABC">
</Campaign>

Acima está o XML esperado. Mas retorna

<Campaign name=\"ABC\">
</Campaign>

Eu posso fazer String.Replace "\", mas esse método está bem? Há algum efeito colateral? Funcionará bem se o XML em si contiver um "\"

Respostas:


179

Não há aspas. É apenas VS depurador. Tente imprimir no console ou salvar em um arquivo e você verá. Como nota lateral: sempre descarte objetos descartáveis:

using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
{
    xmlDoc.WriteTo(xmlTextWriter);
    xmlTextWriter.Flush();
    return stringWriter.GetStringBuilder().ToString();
}

2
+1 para corrigir o código para usar usingblocos e não XmlTextWriter.
John Saunders

1
Vale ressaltar (conforme mencionado nos comentários aqui: msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx ) que os elementos e atributos não serão gravados até que você chame o método Close do XmlWriter.
tom de

Alguns deles podem ser escritos imediatamente. Depende do buffer. Independentemente disso, adicionei uma chamada para Flush, embora uma ligação Closeou apenas o fechamento do xmlTextWriter usingbloco fizesse o mesmo.
27712 Brian

12
Para tornar o xml bonito, passe esse objeto de configurações para XmlWriter.Create: XmlWriterSettings settings = new XmlWriterSettings (); settings.Indent = true; settings.IndentChars = ""; settings.Encoding = Encoding.UTF8;
Adam Bruss 18/09/12

655

Supondo que xmlDoc é um objeto XmlDocument que está errado com xmlDoc.OuterXml?

return xmlDoc.OuterXml;

A propriedade OuterXml retorna uma versão em cadeia do xml.


3
Bem, você está certo. Eu tentei isso primeiro, mas quando vi as aspas no depurador. Eu pensei que é por causa do OuterXml e tente esse método StringWriter. Mas eu estava errado, as aspas estavam apenas no depurador. Então, eu vou usar o OuterXml. Graças
akif

Trabalhou para mim! Basta fazer uma verificação nula no xmlDoc! retornar xmlDoc == null? "xmlDoc é nulo": xmlDoc.OuterXml;
SarjanWebDev 27/10/14

1
@SarjanWebDev se você acha que seu objeto pode ser nulo, a verificação nula é desnecessária e para todas as respostas aqui; e realmente para cada interação com um objeto em C # - pessoalmente, eu tento garantir que os objetos sejam sempre construídos para que eu não precise inchar o código com verificações nulas em todos os lugares ... acho que depende apenas da sua base de código. .
Chris Moutray

10
(y), mas não OuterXml não incluem tag <xml version = "1.0" encoding = "utf-16"?> declarativa
hazjack

3
@hazjack se você quiser uma marca declarativa, use a classe XmlDeclaration msdn.microsoft.com/en-us/library/system.xml.xmldeclaration.aspx - se você quiser gravá-la em um arquivo, use o método save encontrado em você XmlDocument exemplo msdn.microsoft.com/en-us/library/dw229a22.aspx - me a tag declarativa só faz sentido se você está escrevendo para dizer arquivo e não uma string C #
Chris Moutray

10

Se você estiver usando Windows.Data.Xml.Dom.XmlDocument versão de XmlDocument(usada nos aplicativos da UWP, por exemplo), poderá usar yourXmlDocument.GetXml()para obter o XML como uma sequência.


5

Como método de extensão:

public static class Extensions
{
    public static string AsString(this XmlDocument xmlDoc)
    {
        using (StringWriter sw = new StringWriter())
        {
            using (XmlTextWriter tx = new XmlTextWriter(sw))
            {
                xmlDoc.WriteTo(tx);
                string strXmlText = sw.ToString();
                return strXmlText;
            }
        }
    }
}

Agora, para usar simplesmente:

yourXmlDoc.AsString()

Este exemplo falha ao chamar Dispose nos dois gravadores.
Joel Mueller

2

"é mostrado como \"no depurador, mas os dados estão corretos na cadeia e você não precisa substituir nada. Tente despejar sua string em um arquivo e você observará que a string está correta.

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.