Автоматический корректор XML - PullRequest
1 голос
/ 29 ноября 2011

В унаследованном приложении, которое поддерживает простые текстовые шаблоны для экспорта информации, я создал шаблон, который экспортирует данные в XML. Дело в том, что текстовая информация не может быть экранирована, поэтому я получил < > знаков в значениях XML, и код, который я имею в .NET, выдает исключение при разборе XML.

Есть ли способ автоматически исправить XML, прежде чем выбросить его в интерпретатор XML?

Пример:

<node>
    Some value which indicates that the quantity < 0.3
</node>

Приведенный выше код должен быть как-то преобразован в

<node>
    Some value which indicates that the quantity &lt; 0.3
</node>

Я не могу выполнить это во время экспорта . То, что у меня есть, это конец XML.

Я думал о поиске комбинаций <{node}> и </{node}>, а тех, у которых нет совпадений - о побеге. Тем не менее, структура может быть многоуровневой, например:

<node>
    <data>
    </data>
    <node>
        <data>
        </data>
    </node>
</node>

И в таком случае, что следует использовать? Обычный алгоритм синтаксического анализа с тоннами процедурного кода в циклах и рекурсивных функциях, или какая-то альтернатива с использованием регулярных выражений?

1 Ответ

0 голосов
/ 30 ноября 2011

Итак, вот что я сделал:

Я составил регулярное выражение, которое нашло возможные теги.

Regex pattern = new Regex(@"<(/?)([a-zA-Z]\w*)(?:(?>!<).)*?(/?)>");

Найдя совпадения, я переходил от одного к другому, избегая всего текста между ними.

Используя стек, я вставил в него каждый открытый тег и обнаружил совпадение для закрывающего тега. Если извлеченный тег не соответствует - либо открывающий тег, либо закрывающий тег недопустим, поэтому я провел дальнейшее изучение совпадений и углубился в стек, чтобы выяснить, какой это на самом деле.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...