Подтвердить что ты не робот

В С#, как преобразовать XmlNode в строку с отступом? (Без циклов)

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

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

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

  • Я попробовал PreserveWhitespace в XmlDocument, но я не смог получить XmlDocument для вывода моего node.
  • Я пробовал свойство 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!
  }

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

4b9b3361

Ответ 1

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

Edit:

Если вам нужно сделать это в нескольких местах, тривиально написать метод расширения для перегрузки 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();
        }
    }
}