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.