XmlDocument'i Dizeye Dönüştür


218

Şu anda dönüştürme ediyorum nasıl İşte XMLDocument için dize

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

xmlDoc.WriteTo(xmlTextWriter);

return stringWriter.ToString();

Bu yöntem ile sorun ben " ((tırnak) özniteliklere sahip) varsa onları kaçar olmasıdır.

Örneğin:

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

Yukarıda beklenen XML. Ama geri dönüyor

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

Yapabileceğim "\" String.Replace ama bu yöntem iyi mi? Herhangi bir yan etkisi var mı? XML'in kendisi bir "\" içeriyorsa düzgün çalışır mı?

Yanıtlar:


180

Alıntı yok. Sadece VS hata ayıklayıcı. Konsola yazdırmayı veya bir dosyaya kaydetmeyi deneyin, göreceksiniz. Yan not olarak: her zaman tek kullanımlık nesneleri atın:

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

2
usingBlok kullanmak için kodu düzeltmek için +1 XmlTextWriter.
John Saunders

1
XmlWriter öğesinin Kapat yöntemini çağırıncaya kadar öğelerin ve özniteliklerin yazılmayacağına dikkat etmek (buradaki açıklamalarda belirtildiği gibi: msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx ).
Ton

Bazıları hemen yazılabilir. Tamponlamaya bağlıdır. Ne olursa olsun, bir çağrı ekledim Flush, ancak bloğa Closeyapılan bir çağrı veya sadece kapatılması xmlTextWriter usingaynı şeyi başaracaktı.
Brian

12
Xml'i güzelleştirmek için, bu ayarlar nesnesini XmlWriter.Create: XmlWriterSettings settings = new XmlWriterSettings (); settings.Indent = true; settings.IndentChars = ""; settings.Encoding = Kodlama.UTF8;
Adam Bruss

655

XmlDoc xmlDoc.OuterXml ile yanlış olan bir XmlDocument nesnesi olduğunu varsayarsak?

return xmlDoc.OuterXml;

OuterXml mülkiyet xml dize sürümünü döndürür.


3
Haklısın. İlk önce denedim ama hata ayıklayıcıda tırnakları görünce. Onun OuterXml nedeniyle düşündüm ve bu StringWriter yöntemini deneyin. Ama yanlış sözler sadece hata ayıklayıcı idi. Bu yüzden sadece OuterXml kullanacağım. Teşekkürler
akif

Benim için çalıştı! Sadece xmlDoc üzerinde boş bir kontrol yapın! return xmlDoc == null? "xmlDoc null": xmlDoc.OuterXml;
SarjanWebDev

1
@SarjanWebDev nesnenizin boş olabileceğini düşünüyorsanız, boş kontrol söylemeye gerek kalmadan ve burada her cevap için gider; ve gerçekten C # bir nesne ile her etkileşim için - şahsen ben her yerde null kontrolleri ile kod şişirmek zorunda kalmamak için nesneleri her zaman inşa emin olmak için çalışın ... Sanırım sadece kod tabanınıza bağlıdır .. .
Chris Moutray

10
(y) ancak OuterXml, <? xml sürüm = "1.0" kodlama = "utf-16"?>
hazjack

3
@hazjack bildirim etiketi istiyorsanız XmlDeclaration Sınıfını kullanın msdn.microsoft.com/en-us/library/system.xml.xmldeclaration.aspx - daha sonra dosyaya yazmak istiyorsanız bulunan kaydetme yöntemini kullanın size XmlDocument örneği msdn.microsoft.com/tr-tr/library/dw229a22.aspx - benim için bildirici etiket sadece bir C # dizesi değil dosya demek için yazıyorsanız, mantıklıdır
Chris Moutray

10

Windows.Data.Xml.Dom.XmlDocumentSürümünü kullanıyorsanız XmlDocument(örneğin UWP uygulamalarında kullanılır), yourXmlDocument.GetXml()XML'i dize olarak almak için kullanabilirsiniz .


5

Bir uzantı yöntemi olarak:

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

Şimdi basitçe kullanmak için:

yourXmlDoc.AsString()

Bu örnek, iki yazar için Dispose olarak adlandırılamaz.
Joel Mueller

2

"\"hata ayıklayıcıda olduğu gibi gösterilir , ancak veriler dizede doğrudur ve herhangi bir şeyi değiştirmeniz gerekmez. Dizenizi bir dosyaya dökmeyi deneyin; dizenin doğru olduğunu unutmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.