Konwertuj XmlDocument na String

218

Oto jak obecnie konwertuję XMLDocument na String

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

xmlDoc.WriteTo(xmlTextWriter);

return stringWriter.ToString();

Problem z tą metodą polega na tym, że jeśli mam ((cytaty), które mam w atrybutach), to ucieka od nich.

Na przykład:

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

Powyżej znajduje się oczekiwany XML. Ale powraca

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

Mogę wykonać String.Replace „\”, ale czy ta metoda jest w porządku? Czy są jakieś skutki uboczne? Czy będzie działać poprawnie, jeśli sam plik XML zawiera „\”

akif
źródło

Odpowiedzi:

180

Nie ma żadnych cytatów. To tylko debugger VS. Spróbuj wydrukować na konsoli lub zapisać do pliku, a zobaczysz. Na marginesie: zawsze usuwaj przedmioty jednorazowego użytku:

using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
{
    xmlDoc.WriteTo(xmlTextWriter);
    xmlTextWriter.Flush();
    return stringWriter.GetStringBuilder().ToString();
}
Darin Dimitrov
źródło
2
+1 za ustalenie kodu do używania usingbloków, a nie XmlTextWriter.
John Saunders,
1
Warto zauważyć (jak wspomniano w uwagach tutaj: msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx ), że elementy i atrybuty nie zostaną zapisane, dopóki nie wywołasz metody Close XrWriter.
Ton
Niektóre z nich mogą zostać napisane natychmiast. To zależy od buforowania. Niezależnie od tego dodałem wywołanie Flush, chociaż wywołanie Closelub tylko zamknięcie xmlTextWriter usingbloku osiągnęłoby to samo.
Brian
12
Aby xml był ładny, przekaż ten obiekt ustawień do XmlWriter.Create: XmlWriterSettings settings = new XmlWriterSettings (); settings.Indent = true; settings.IndentChars = ""; settings.Encoding = Encoding.UTF8;
Adam Bruss,
655

Zakładając, że xmlDoc jest obiektem XmlDocument, co jest nie tak z xmlDoc.OuterXml?

return xmlDoc.OuterXml;

Właściwość OuterXml zwraca ciąg znaków w wersji xml.

Chris Moutray
źródło
3
Masz rację. Próbowałem tego pierwszy, ale kiedy zobaczyłem cytaty w debuggerze. Myślałem, że to z powodu OuterXml i spróbuj tej metody StringWriter. Ale myliłem się, cytaty były tylko w debuggerze. Więc po prostu użyję OuterXml. Dzięki
akif
Pracował dla mnie! Po prostu sprawdź zerowanie na xmlDoc! zwróć xmlDoc == null? „xmlDoc jest pusty”: xmlDoc.OuterXml;
SarjanWebDev
1
@SarjanWebDev, jeśli uważasz, że Twój obiekt może mieć wartość NULL, to sprawdzanie wartości NULL jest oczywiste i dla każdej odpowiedzi tutaj; i naprawdę dla każdej interakcji z obiektem w C # - osobiście staram się, aby obiekty były zawsze budowane, aby nie musiałem nadpisywać kodu zerowymi kontrolami wszędzie ... myślę, że to zależy tylko od twojej bazy kodu. .
Chris Moutray
10
(y) ale OuterXml nie zawiera deklaratywnego tagu <? xml version = "1.0" encoding = "utf-16"?>
hazjack
3
@hazjack, jeśli chcesz tag deklaratywny, skorzystaj z klasy XmlDeclaration msdn.microsoft.com/en-us/library/system.xml.xmldeclaration.aspx - jeśli chcesz zapisać go do pliku, użyj znalezionej metody zapisu na tobie instancja XmlDocument msdn.microsoft.com/en-us/library/dw229a22.aspx - dla mnie znacznik deklaratywny ma sens tylko wtedy, gdy piszesz, aby powiedzieć plik, a nie ciąg C #
Chris Moutray
10

Jeśli używasz Windows.Data.Xml.Dom.XmlDocumentwersji XmlDocument(używanej na przykład w aplikacjach UWP), możesz użyć, yourXmlDocument.GetXml()aby pobrać XML jako ciąg.

Whyser
źródło
5

Jako metoda rozszerzenia:

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;
            }
        }
    }
}

Teraz po prostu użyj:

yourXmlDoc.AsString()
SixOThree
źródło
W tym przykładzie nie można wywołać Dispose na dwóch pisarzach.
Joel Mueller
2

"jest pokazany jak \"w debuggerze, ale dane są poprawne w ciągu i nie trzeba niczego zamieniać. Spróbuj zrzucić ciąg do pliku, a zauważysz, że ciąg jest poprawny.

Arsen Mkrtchyan
źródło