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 „\”

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

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.


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.


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.