Chuyển đổi XmlDocument thành Chuỗi


218

Đây là cách tôi hiện đang chuyển đổi XMLDocument thành String

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

xmlDoc.WriteTo(xmlTextWriter);

return stringWriter.ToString();

Vấn đề với phương pháp này là nếu tôi có " ((trích dẫn) mà tôi có trong các thuộc tính) thì nó thoát khỏi chúng.

Ví dụ:

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

Trên đây là XML dự kiến. Nhưng nó trở lại

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

Tôi có thể thực hiện String.Replace "\" nhưng phương thức đó có ổn không? Có bất kỳ tác dụng phụ? Nó có hoạt động tốt không nếu bản thân XML chứa "\"

Câu trả lời:


179

Không có bất kỳ trích dẫn nào. Nó chỉ là trình gỡ lỗi VS. Hãy thử in ra bàn điều khiển hoặc lưu vào một tệp và bạn sẽ thấy. Như một lưu ý phụ: luôn vứt bỏ đồ vật dùng một lần:

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

2
+1 để sửa mã để sử dụng usingcác khối và không XmlTextWriter.
John Saunders

1
Đáng chú ý (như đã đề cập trong phần nhận xét ở đây: msdn.microsoft.com/en-us/l Library / system.xml.xmlwriter.aspx ) rằng các phần tử và thuộc tính sẽ không được viết cho đến khi bạn gọi phương thức Đóng của XmlWriter.
TonE

Một số trong số họ có thể được viết ngay lập tức. Nó phụ thuộc vào bộ đệm. Bất kể, tôi đã thêm một cuộc gọi đến Flush, mặc dù một cuộc gọi đến Closehoặc chỉ đóng xmlTextWriter usingkhối sẽ thực hiện tương tự.
Brian

12
Để làm cho xml đẹp, hãy chuyển đối tượng cài đặt này vào XmlWriter.Create: XmlWriterSinstall settings = new XmlWriterSinstall (); cài đặt.Inent = true; cài đặt.InentChars = ""; cài đặt.Encoding = Encoding.UTF8;
Adam Brussel

655

Giả sử xmlDoc là một đối tượng XmlDocument có gì sai với xmlDoc.OuterXml?

return xmlDoc.OuterXml;

Các bất động sản OuterXml trả về một chuỗi phiên bản của xml.


3
Vâng, bạn đúng. Tôi đã thử điều đó trước tiên nhưng khi tôi thấy các trích dẫn trong trình gỡ lỗi. Tôi nghĩ rằng đó là vì OuterXml và thử phương thức StringWriter đó. Nhưng tôi đã sai các trích dẫn chỉ có trong trình gỡ lỗi. Vì vậy, tôi sẽ chỉ sử dụng OuterXml. Cảm ơn
akif

Đã làm cho tôi! Chỉ cần kiểm tra null trên xmlDoc! trả lại xmlDoc == null? "xmlDoc là null": xmlDoc.OuterXml;
SarjanWebDev

1
@SarjanWebDev nếu bạn nghĩ rằng đối tượng của bạn có thể là null, thì kiểm tra null sẽ không cần nói và cho mọi câu trả lời ở đây; và thực sự cho mọi tương tác với một đối tượng trong C # - cá nhân tôi cố gắng đảm bảo các đối tượng luôn được xây dựng để tôi không phải làm phồng mã bằng các kiểm tra null ở mọi nơi ... tôi đoán nó chỉ phụ thuộc vào cơ sở mã của bạn .. .
Chris Moutray

10
(y) nhưng OuterXml không bao gồm thẻ khai báo <? xml version = "1.0" mã hóa = "utf-16"?>
hazjack

3
@hazjack nếu bạn muốn thẻ khai báo thì hãy sử dụng Lớp XmlDeclaration msdn.microsoft.com/en-us/l Library / system.xml.xmldeclaration.aspx - nếu sau đó bạn muốn ghi nó vào tệp thì hãy sử dụng phương thức lưu đối với bạn, ví dụ XmlDocument msdn.microsoft.com/en-us/l
Library / dw229a22.aspx

10

Nếu bạn đang sử dụng Windows.Data.Xml.Dom.XmlDocumentphiên bản XmlDocument(được sử dụng trong các ứng dụng UWP chẳng hạn), bạn có thể sử dụng yourXmlDocument.GetXml()để lấy XML dưới dạng chuỗi.


5

Là một phương pháp mở rộng:

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

Bây giờ để sử dụng đơn giản:

yourXmlDoc.AsString()

Ví dụ này không gọi Dispose trên hai nhà văn.
Joel Mueller

2

"được hiển thị như \"trong trình gỡ lỗi, nhưng dữ liệu là chính xác trong chuỗi và bạn không cần phải thay thế bất cứ điều gì. Cố gắng kết xuất chuỗi của bạn vào một tệp và bạn sẽ lưu ý rằng chuỗi đó là chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.