Фон
Большую часть времени я использую код Visual Studio для файлов кода.
Я привык к форматированию XML в Visual Studio с первым атрибутом в первой строке, остальные выровнен в следующей строке с некоторым отступом.
Я пробовал много расширений, но он не будет выглядеть точно так же, как в Visual Studio; либо первый атрибут не останется в первой строке, либо следующие атрибуты не совпадают с первым символом первого атрибута.
Я искал пакеты в NPM, чтобы достичь этого, не мог найти ничего, что легко выполняет эту работу. Я нашел пару парсеров, но все же вам пришлось бы перекодировать их много.
Visual Studio не является открытым исходным кодом, поэтому я не думаю, что у меня будет доступ к тому же надежному коду с готовностью. Поэтому я просто пытаюсь смоделировать это форматирование в коде
TL; DR
Вопрос 1
Существует ли синтаксический анализатор или форматер XML, например Visual Studio форматер? Я не смог найти его, поэтому я просто пытаюсь смоделировать это форматирование из C#, я читал в других постах упоминание XMLWriter
с XmlWriterSettings
, но я нашел его быть как ниже.
- [x] Каждый атрибут в новой строке
- [] Первый атрибут в первой строке
- [] Атрибуты следующей строки выровнены относительно первой.
- [x] Хорошая обработка исключений.
private static void FormatXML(XmlDocument xml)
{
StringBuilder sb = new StringBuilder();
var root = xml.DocumentElement;
PrintNode(root, sb);
sb.Append("\n" + "</" + root.Name + ">");
Console.WriteLine(sb.ToString());
}
private static void PrintNode(XmlNode node, StringBuilder sb)
{
sb.Append(new string(' ', firstLength) + "<" + node.Name;
if (node.Attributes?.Count > 0)
{
firstLength += new string("<" + node.Name + " ").Length;
sb.Append(" ");
for (int i = 0; i < node.Attributes.Count; i++)
{
var attribute = node.Attributes[i] as XmlAttribute;
var isLast = (i == (node.Attributes.Count - 1));
var newline = isLast ? "" : "\n";
sb.Append(attribute.Name + "=\"" + attribute.Value + "\"" + newline);
if (isLast)
sb.Append(">");
else
sb.Append(new String(' ', firstLength));
}
}
else
{
sb.Append(">");
}
//prints nodes
if (node.HasChildNodes)
{
firstLength += 2;
for (int j = 0; j < node.ChildNodes.Count; j++)
{
sb.Append("\n");
var currentSpace = firstLength;
PrintNode(node.ChildNodes[j], sb);
//close tag
if(node.ChildNodes[j].NodeType != XmlNodeType.Comment)
sb.Append("\n" + new string(' ', currentSpace) + "</" + node.ChildNodes[j].Name + ">");
}
}
return;
}
Таким образом, проблема заключается в том, что это выглядит так много манипуляций и использование ручных добавлений строк, таких как <
, >
, \r\n
, xml заголовок и пробелы и так далее, которые я не думаю, кажется идеальным. В прошлом я использовал ResxParser и Writer.
Вопрос 2
Можно ли расширить XmlWriterSettings
/ XmlWriter
для достижения желаемого форматирования XML? Я не думаю, что у нас есть доступ к XmlWriter
, поскольку он находится в сборке System. Xml, и мы не можем увидеть код, если не декомпилируем DLL? Как я могу это сделать? Если есть какие-либо библиотеки с открытым исходным кодом, чтобы достичь этого, это еще лучше. Мне не нужна эта рекомендация, но подход к улучшению загроможденного подхода приведенного выше кода был бы действительно полезным.