Ubah XmlDocument menjadi String

218

Inilah cara saya saat ini mengkonversi XMLDocument ke String

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

xmlDoc.WriteTo(xmlTextWriter);

return stringWriter.ToString();

Masalah dengan metode ini adalah bahwa jika saya memiliki " ((tanda kutip) yang saya miliki dalam atribut) itu lolos dari mereka.

Misalnya:

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

Di atas adalah XML yang diharapkan. Tapi itu kembali

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

Saya dapat melakukan String.Replace "\" tetapi apakah metode itu oke? Apakah ada efek samping? Apakah ini akan berfungsi dengan baik jika XML itu sendiri mengandung "\"

akif
sumber

Jawaban:

179

Tidak ada kutipan. Itu hanya VS debugger. Coba cetak ke konsol atau simpan ke file dan Anda akan melihat. Sebagai catatan: selalu buang benda sekali pakai:

using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
{
    xmlDoc.WriteTo(xmlTextWriter);
    xmlTextWriter.Flush();
    return stringWriter.GetStringBuilder().ToString();
}
Darin Dimitrov
sumber
2
+1 untuk memperbaiki kode untuk menggunakan usingblok dan tidak XmlTextWriter.
John Saunders
1
Perlu dicatat (sebagaimana disebutkan dalam komentar di sini: msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx ) bahwa elemen dan atribut tidak akan ditulis sampai Anda memanggil metode Close dari XmlWriter.
TonE
Beberapa dari mereka dapat ditulis segera. Itu tergantung pada buffering. Terlepas dari itu, saya menambahkan panggilan ke Flush, meskipun panggilan ke Closeatau hanya menutup xmlTextWriter usingblok akan mencapai hal yang sama.
Brian
12
Untuk membuat xml cantik, kirimkan objek pengaturan ini ke XmlWriter.Create: XmlWriterSettings settings = new XmlWriterSettings (); settings.Indent = true; settings.IndentChars = ""; settings.Encoding = Encoding.UTF8;
Adam Bruss
655

Menganggap xmlDoc adalah objek XmlDocument apa yang salah dengan xmlDoc.OuterXml?

return xmlDoc.OuterXml;

The properti OuterXml mengembalikan versi string xml.

Chris Moutray
sumber
3
Ya kamu benar. Saya mencobanya dulu tetapi ketika saya melihat tanda kutip di debugger. Saya pikir ini karena OuterXml dan coba metode StringWriter. Tapi saya salah kutipan hanya ada di debugger. Jadi saya hanya akan menggunakan OuterXml. Terima kasih
akif
Bekerja untukku! Lakukan saja pemeriksaan nol pada xmlDoc! kembali xmlDoc == null? "xmlDoc is null": xmlDoc.OuterXml;
SarjanWebDev
1
@ SarjanWebDev jika Anda berpikir objek Anda bisa nol, maka cek-kosong tidak perlu dikatakan dan untuk setiap jawaban di sini; dan benar-benar untuk setiap interaksi dengan objek di C # - secara pribadi saya mencoba untuk memastikan objek selalu dibangun sehingga saya tidak perlu mengasapi kode dengan null-check di mana-mana ... saya kira itu hanya tergantung pada basis kode Anda .. .
Chris Moutray
10
(y) tetapi OuterXml tidak termasuk tag deklaratif <? xml version = "1.0" encoding = "utf-16"?>
hazjack
3
@hazjack jika Anda ingin tag deklaratif maka manfaatkan kelas XmlDeclaration msdn.microsoft.com/en-us/library/system.xml.xmldeclaration.aspx - jika Anda ingin menulisnya ke file lalu gunakan metode simpan yang ditemukan pada Anda XmlDocument instance msdn.microsoft.com/en-us/library/dw229a22.aspx - bagi saya tag deklaratif hanya masuk akal jika Anda menulis untuk mengatakan file dan bukan string C #
Chris Moutray
10

Jika Anda menggunakan Windows.Data.Xml.Dom.XmlDocumentversi XmlDocument(digunakan dalam aplikasi UWP misalnya), Anda dapat menggunakan yourXmlDocument.GetXml()untuk mendapatkan XML sebagai string.

Whyser
sumber
5

Sebagai metode ekstensi:

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

Sekarang untuk menggunakan hanya:

yourXmlDoc.AsString()
SixOThree
sumber
Contoh ini gagal memanggil Buang pada dua penulis.
Joel Mueller
2

"ditampilkan seperti \"di debugger, tetapi data sudah benar dalam string, dan Anda tidak perlu mengganti apa pun. Cobalah untuk membuang string Anda ke file dan Anda akan perhatikan bahwa string sudah benar.

Arsen Mkrtchyan
sumber