Преобразовать 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 в виде строки.


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 для двух авторов.
Джоэл Мюллер

2

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.