Visual Studio, как XML форматирование из C# Xml синтаксический анализ - PullRequest
1 голос
/ 28 марта 2020

Фон

Большую часть времени я использую код 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? Как я могу это сделать? Если есть какие-либо библиотеки с открытым исходным кодом, чтобы достичь этого, это еще лучше. Мне не нужна эта рекомендация, но подход к улучшению загроможденного подхода приведенного выше кода был бы действительно полезным.

...