В С#, как преобразовать 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.
Ответы
Ответ 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();
}
}
}