Обновить

Парсить XML при помощи регулярных выражений нельзя… но давайте попробуем

Уровень сложностиСредний
Время на прочтение14 мин
Количество просмотров2.3K
Всего голосов 3: ↑3 и ↓0+5
Комментарии7

Комментарии 7

Я сломался вот на этой строке:

Напомню, что стек — это очередь/массив, в которых операции подвергаются push, то есть добавлению значения в конец, и pop, при котором это значение возвращается в программу.

Кстати - да. Стек и очередь - две структуры данных (точнее - типа данных), реализующих разный способ извлечения элементов. Правильнее было бы назвать массивами или списками.

Здесь в комментариях-описаниях неверно изложена логика. Начиная со строк 4 и 5 некорректно отражены действия и состояния стека.

                     #              stack=()
<a>                  # push a;      stack=(a)
    <b>              # push b;      stack=(a b)
        <c>meow</c>  # push c;      stack=(a b c)
        <d>nya</d>   # pop; push d; stack=(a b d)
    </b>             # pop;         stack=(a b)
</a>                 # pop;         stack=(a)
                     # pop;         stack=()

Логичнее было бы так: каждому <tag> соответствует свой push tag , и каждому </tag> соответствует свой pop. Тогда состояние стека, выражаемое stack=(...), точно соотвествовало бы действиям.

                     #              stack=()
<a>                  # push a;      stack=(a)
    <b>              # push b;      stack=(a b)
        <c>meow</c>  # push c; pop; stack=(a b c) stack=(a b)
        <d>nya</d>   # push d; pop; stack=(a b d) stack=(a b)
    </b>             # pop;         stack=(a)
</a>                 # pop;         stack=()

Странно, успешно парсил и HTML и XML регулярками. Хорошо что не знал, что, оказывается, нельзя парсить.

Тут нужно смотреть, что вы парсили и что вы имели в виду под тем что делали это регулярными выражениями. Парсинг можно разбить на два этапа лексический и синтаксический анализ. Лексический анализ можно сделать регулярными выражениями(по крайней мере я не знаю обратного примера), говоря про не возможность парсинга html регулярными выражениями имеют ввиду синтаксический анализ. Например возьмем такой код:

<div> <div> text <\div> <\div>

С помощью регулярных выражений мы можем превратить его в например такую строку:

open_tag: div,
open_tag: div,
text: "text",
close_tag: div,
close_tag: div,

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

div -> div(text)

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

Я не имел ввиду создание дерева с помощью html/xml. Смотрите, как звучит заголовок "Парсить XML при помощи регулярных выражений нельзя… но давайте попробуем". О дереве в заголовке речь не идет. Распарсить, чтобы вытащить значимую информацию - можно. Пусть не за 1 этап. Получается, мы имели ввиду разные виды парсинга

У меня была задача перенести около 50 файлов XML в базу данных SQL. Наследство старой программы, которая использовала XML в качестве базы данных и элементов интерфейса. и редактировалась эта XML пользователем. Некоторые файлы были больше сотни страниц. Нужно было сохранить связи в дереве объектов тоже. От 2 до 4 уровня вложенности. Все пришлось делать не регулярками, а переносить в таблицу sql сервера и далее уже обрабатывать запросами, выдергивая нужную информацию и заполняя полдесятка таблиц.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации