Перетворити 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.Replace "\", але чи це добре? Чи є побічні ефекти? Чи буде добре працювати, якщо сам 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.
Джон Сондерс

1
Варто зауважити (як зазначено в зауваженнях тут: msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx ), що елементи та атрибути не будуть записані, поки ви не зателефонуєте до методу Close XmlWriter.
TonE

Деякі з них можуть бути написані негайно. Це залежить від буферизації. Незалежно від того, я додав дзвінок Flush, хоча виклик Closeабо просто закриття xmlTextWriter usingблоку здійснив би те саме.
Брайан

12
Щоб зробити xml гарним, передайте цей об’єкт налаштувань XmlWriter.Create: XmlWriterSettings settings = new XmlWriterSettings (); settings.Indent = true; settings.IndentChars = ""; settings.Encoding = Encoding.UTF8;
Адам Брусс

655

Якщо припустити, що xmlDoc є об'єктом XmlDocument, що не так у xmlDoc.OuterXml?

return xmlDoc.OuterXml;

Властивість OuterXml повертає строкову версію в форматі XML.


3
Ну ви праві. Я спробував це спочатку, але коли побачив цитати в налагоджувачі. Я подумав, що це через OuterXml і спробувати цей метод StringWriter. Але я помилявся, цитати були лише в налагоджувачі. Тому я просто використовувати OuterXml. Спасибі
akif

Працювали для мене! Просто зробіть нульову перевірку на xmlDoc! повернути xmlDoc == null? "xmlDoc є нульовим": xmlDoc.OuterXml;
SarjanWebDev

1
@SarjanWebDev, якщо ви думаєте, що ваш об’єкт міг бути недійсним, тоді перевірка нуля не відповідає, і на кожну відповідь тут; і справді для кожної взаємодії з об'єктом у C # - особисто я намагаюся забезпечити, щоб об’єкти завжди були побудовані так, що мені не доведеться скрізь переповнювати код за допомогою нульових перевірок ... я думаю, це просто залежить від вашої бази коду .. .
Кріс Маутрей

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 #
Кріс Маутрей,

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()

Цей приклад не може викликати розпорядження двох авторів.
Джоель Мюллер

2

"відображається як \"у відладчику, але дані в рядку є правильними, і вам не потрібно нічого замінювати. Спробуйте скинути рядок у файл, і ви помітите, що рядок є правильним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.