แปลง XmlDocument เป็น String


218

นี่คือวิธีที่ฉันกำลังแปลงXMLDocumentเป็นString

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

xmlDoc.WriteTo(xmlTextWriter);

return stringWriter.ToString();

ปัญหาของวิธีนี้คือถ้าฉันมี" (((เครื่องหมายคำพูด) ที่ฉันมีอยู่ในคุณสมบัติ) มันจะหนีออกมา

สำหรับอินสแตนซ์:

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

ด้านบนเป็น XML ที่คาดหวัง แต่มันกลับมา

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

ฉันสามารถใช้String แทนที่ "\"แต่วิธีการนั้นใช้ได้หรือไม่ มีผลข้างเคียงหรือไม่? มันจะทำงานได้ดีไหมถ้า XML นั้นมี"\" อยู่ด้วย

คำตอบ:


180

ไม่มีคำพูดใด ๆ มันเป็นเพียงแค่ดีบัก VS ลองพิมพ์ไปที่คอนโซลหรือบันทึกเป็นไฟล์แล้วคุณจะเห็น ในฐานะที่เป็นหมายเหตุด้านข้าง: กำจัดวัตถุที่ใช้แล้วทิ้งเสมอ:

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

2
+1 สำหรับการแก้ไขรหัสเพื่อใช้บล็อกและไม่ได้using XmlTextWriter
John Saunders

1
การสังเกตเห็นค่าควรทำ (ดังกล่าวในหมายเหตุที่นี่: msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx ) องค์ประกอบและแอตทริบิวต์จะไม่ถูกเขียนจนกว่าคุณจะเรียกวิธีการปิดของ XmlWriter
TonE

บางส่วนของพวกเขาอาจถูกเขียนทันที มันขึ้นอยู่กับการบัฟเฟอร์ ไม่ว่าฉันจะเพิ่มการโทรถึงFlushแม้ว่าการโทรไปยังCloseหรือเพียงแค่ปิดการxmlTextWriter usingบล็อกจะทำให้สำเร็จ
Brian

12
ในการทำให้ xml สวยให้ส่งผ่านวัตถุการตั้งค่านี้ไปที่ XmlWriter.Create: XmlWriterSettings settings = new XmlWriterSettings (); settings.Indent = true; settings.IndentChars = ""; settings.Encoding = Encoding.UTF8;
Adam Bruss

655

สมมติว่า xmlDoc เป็นวัตถุ XmlDocument เกิดอะไรขึ้นกับ xmlDoc.OuterXml?

return xmlDoc.OuterXml;

คุณสมบัติ OuterXmlส่งกลับรุ่นสตริงของ XML


3
คุณพูดถูก ฉันลองครั้งแรก แต่เมื่อฉันเห็นคำพูดในตัวดีบัก ฉันคิดว่ามันเป็นเพราะ OuterXml และลองใช้วิธีการ StringWriter แต่ฉันคิดผิดราคาถูกเฉพาะในโปรแกรมดีบั๊ก ดังนั้นฉันจะใช้ OuterXml ขอบคุณ
akif

ทำงานให้ฉัน! เพียงตรวจสอบค่า null บน xmlDoc! ส่งคืน xmlDoc == null หรือไม่ "xmlDoc เป็นโมฆะ": xmlDoc.OuterXml;
SarjanWebDev

1
@SarjanWebDev ถ้าคุณคิดว่าวัตถุของคุณอาจเป็นโมฆะการตรวจสอบโมฆะก็ไม่จำเป็นต้องพูดและตอบทุกคำตอบที่นี่ และจริง ๆ แล้วสำหรับการโต้ตอบกับวัตถุใน C # - ส่วนตัวฉันพยายามให้แน่ใจว่าวัตถุถูกสร้างขึ้นเสมอเพื่อให้ฉันไม่ต้องขยายโค้ดด้วยการตรวจสอบ null ทุกที่ ... ฉันเดาว่ามันขึ้นอยู่กับฐานรหัสของคุณ .. .
Chris Moutray

10
(y) แต่ OuterXml ไม่รวมแท็กที่ประกาศ <? xml version = "1.0" encoding = "utf-16"?>
hazjack

3
@hazjack หากคุณต้องการให้แท็กที่ประกาศใช้ประโยชน์จากคลาสXmlDeclaration msdn.microsoft.com/en-us/library/system.xml.xmldeclaration.aspx - หากคุณต้องการเขียนไปยังไฟล์จากนั้นใช้เมธอดบันทึกที่พบ ในอินสแตนซ์ XmlDocument ของคุณmsdn.microsoft.com/en-us/library/dw229a22.aspx - สำหรับฉันแล้วแท็กที่ประกาศจะใช้งานได้ก็ต่อเมื่อคุณกำลังเขียนเพื่อพูดไฟล์และไม่ใช่สตริง C #
Chris Moutray

10

หากคุณกำลังใช้Windows.Data.Xml.Dom.XmlDocumentเวอร์ชันXmlDocument(ใช้ในแอป UWP เป็นต้น) คุณสามารถใช้yourXmlDocument.GetXml()เพื่อรับ XML เป็นสตริง


5

เป็นวิธีการขยาย:

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

ตอนนี้ใช้ง่าย ๆ :

yourXmlDoc.AsString()

ตัวอย่างนี้ไม่สามารถเรียกใช้ Dispose บนตัวเขียนสองคน
Joel Mueller

2

"จะปรากฏ\"ใน debugger แต่ข้อมูลนั้นถูกต้องในสตริงและคุณไม่จำเป็นต้องแทนที่อะไร ลองดัมพ์สตริงของคุณไปยังไฟล์และคุณจะทราบว่าสตริงนั้นถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.