В C # как преобразовать XmlNode в строку с отступом?(Без зацикливания) - PullRequest
20 голосов
/ 22 июня 2011

Это, должно быть, такой простой вопрос, но я просто не могу получить ответ.

У меня есть XmlNode, и все, что я хочу сделать, это вывести этот узел в виде строки с неповрежденными отступами (табуляциями или пробелами) для обеспечения лучшей читаемости.

До сих пор я пробовал XmlWriter, XmlTextWriter, XmlDocument, XmlReader.

  • Я попробовал PreserveWhitespace в XmlDocument, но не смог получить XmlDocument для вывода моего узла.
  • Я попытался использовать свойство Formatting = Formatting.Indented в XmlTextWriter, но не смог понять, как выводить содержимое в строку.

Вывести XmlNode в виде строки БЕЗ отступа легко. Я просто делаю XmlNode.OuterXml. Как мне получить там отступы?

Я хочу сделать это без зацикливания на узле XmlNode и использования грубой силы для добавления пробела, потому что я думаю, что должен быть более простой способ.

Спасибо.

Редактировать: Для будущих читателей, вот ответ:

  var xmlNode = is some object of type XmlNode

  using (var sw = new StringWriter())
  {
      using (var xw = new XmlTextWriter(sw))
      {
        xw.Formatting = Formatting.Indented;
        xw.Indentation = 2; //default is 1. I used 2 to make the indents larger.

        xmlNode.WriteTo(xw);
      }
      return sw.ToString(); //The node, as a string, with indents!
  }

Причиной, по которой мне нужно было это сделать, был вывод xml узла с подсветкой синтаксиса. Я использовал AvalonEdit, чтобы выделить xml, вывел выделенный текст в html, затем преобразовал html в FlowDocument, который мог бы отображаться в RichTextBox.

Ответы [ 2 ]

29 голосов
/ 22 июня 2011

Вы были на правильном пути с XMLTextWriter, вам просто нужно использовать StringWriter в качестве основного потока.Вот несколько хороших ответов о том, как это сделать.Обратите особое внимание на второй ответ, если ваша кодировка должна быть UTF-8.

Редактировать:

Если вам нужно сделать это в нескольких местах, написать метод расширения тривиальноперегрузить ToString() на XmlNode:

public static class MyExtensions
{
    public static string ToString(this System.Xml.XmlNode node, int indentation)
    {
        using (var sw = new System.IO.StringWriter())
        {
            using (var xw = new System.Xml.XmlTextWriter(sw))
            {
                xw.Formatting = System.Xml.Formatting.Indented;
                xw.Indentation = indentation;
                node.WriteContentTo(xw);
            }
            return sw.ToString();
        }
    }
}
0 голосов
/ 30 марта 2019

Если вам не нужны память или производительность, самое простое:

    XElement.Parse(xmlNode.OuterXml).ToString()
...