Преобразовать XmlDocument в строку

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.
Тон
Некоторые из них могут быть написаны сразу. Это зависит от буферизации. Несмотря на это, я добавил вызов 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. Спасибо
Акиф
Работал на меня! Просто сделайте нулевую проверку на xmlDoc! вернуть xmlDoc == ноль? "xmlDoc is null": xmlDoc.OuterXml;
SarjanWebDev
1
@SarjanWebDev, если вы думаете, что ваш объект может быть нулевым, тогда проверка нуля проходит без слов и для каждого ответа здесь; и действительно для каждого взаимодействия с объектом в C # - лично я стараюсь, чтобы объекты всегда создавались так, чтобы мне не приходилось раздувать код с помощью нулевых проверок везде ... я думаю, это зависит только от вашей кодовой базы .. .
Крис 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 в виде строки.

Whyser
источник
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()
SixOThree
источник
В этом примере не удается вызвать Dispose для двух авторов.
Джоэл Мюллер
2

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

Арсен Мкртчян
источник