XML парсер своими руками...?

Алгоритмы: от сортировки пузырьком до численных методов

Модераторы: C_O_D_E, DeeJayC

ip
Сообщения: 7
Зарегистрирован: 12 янв 2005, 03:54
Контактная информация:

24 янв 2005, 15:38

Здравствуйте.
Хотелось бы узнать, что будет эффективнее, если стоит такая задача:
Есть xml файл, нужно написать свой парсер (не используя библиотеки др. разработчиков, типа libxml, expat и др.)
Т.е. к примеру xml такой:

Код: Выделить всё

<a>
  [b][/b]
</a>
Я напишу приблизительный алгоритм (как я себе представляю), а вы меня поправте пожалуйста.

1) Определяем начало и конец каждого тега (т.е. позицию "<" и ">")
Вопрос: если нам за ранее не известно число тегов, то тут явно нужен динамический массив, но как лучше сделать?
а) первый раз пропарсить текст, подсчитать кол-во "<" и кол-во ">", затем на основании этого создать динамический массив. И дальше уже по второму разу парсить текст и заносить в этот массив позиции начала/конца тега ("<" и ">").
б) сразу создать динамический массив, учитывая то, что в минимальном случае число "<" будет равно

Код: Выделить всё

angel_brackets = sizeof(xml_string)/sizeof(char) / 4 + 1;
или
angel_brackets = ((sizeof(xml_string)/sizeof(char)) >> 2) + 1;
т.е. четверть от всего кол-ва символов плюс 1 - это число открывающихся угловых скобок, и по идеи число открывающихся угловых скобок должно быть равно закрывающимся.
Значит можно создавать динамический массив из left_angel_brackets элементов. Если в данном примере все нормально (см. выше) и число скобок можно вычислить с небольшой погрешностью (в сторону увеличения), то если пример будет содержать не пустые теги, а текст и имена тегов будут длинные, то избыток будет ОЧЕНЬ заметным... в n раз. Получается расход памяти увеличивается....Что плохо.

Как тут лучше поступить?

2) Парсим от первой "<" до первой ">" получаем имя открывающегося тега + параметры (если например <a id="123">) и т.д. от второй "<" до второй ">" - второй тег. С проверкой того, чтобы за "<" не следовал символ "/" иаче это закрывающийся тег.

3) сохраняем все это в какую-то структуру.
Вопрос: как хранят структуру XML? Нужно смотреть в сторону деревьев? Может кто подскажет, куда копать?

Это общая такая концепция, является ли она здравой? Или совсем не годится?

Спасибо.
evgeny_d
Сообщения: 62
Зарегистрирован: 23 мар 2004, 08:31

24 янв 2005, 16:15

вообще есть 2 подхода к обработке XML.
1) SAX (Simple API for XMLб если я усе правильно помню)
Тут все просто. Документ считывает кусками.

Если попалось открытие тега вызывается что-то типа метода
openTag(String parameters[])
ну и соотв.
closeTag()

Т.е. в памяти ничего обособливо хранить не надо.
Очевидный минус - плохо работать со сложными двевовидными структурами.

Подробнее: http://sax.sourceforge.net/ (там же в исзодниках можно покопаться)

2) DOM (Document Object Model) - более сложная и громоздкая модель.
Отличается тем, что работает с документом в целом. Со всеми вытекающими - деревья, ветки и т.п.
Подробнее: http://www.w3.org/DOM/
evgeny_d
Сообщения: 62
Зарегистрирован: 23 мар 2004, 08:31

24 янв 2005, 16:17

Ну а если хочется самому парзер писать - ИМХО, лучше использовать технологию SAX
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

24 янв 2005, 17:29

На общую концепцию ИМХО тянет,
но ИМХО зачем писать свои дополнительные глюки, когда есть уже написанные.

Там где ты спрашивал про массив - есть (как правило) или можно реализовать самому списки, который разростаются по мере необходимости.
В SAD - все в SAD.
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

24 янв 2005, 18:06

Парсим от первой "<" до первой ">"
Надо учесть, что в значениях атрибутов могут быть символы "<" или ">". Например: <A attr="<opa>">
ip
Сообщения: 7
Зарегистрирован: 12 янв 2005, 03:54
Контактная информация:

24 янв 2005, 20:07

chur писал(а):
Парсим от первой "<" до первой ">"
Надо учесть, что в значениях атрибутов могут быть символы "<" или ">". Например: <A attr="<opa>">
Ну вообщето знаки "<" и ">" не могут быть использованы в качестве значения атрибутов и имен элементов.
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

25 янв 2005, 11:00

Грамотные люди обычно юзают какой-нибудь parser generator типа YACC.
Ему на вход дают специальный файл с описанием синтаксиса на спец. языке, а он в ответ порождает парсер с этого языка (в виде программы на ANSI C).
2B OR NOT(2B) = FF
ip
Сообщения: 7
Зарегистрирован: 12 янв 2005, 03:54
Контактная информация:

25 янв 2005, 17:10

Absurd писал(а):Грамотные люди обычно юзают какой-нибудь parser generator типа YACC.
Ему на вход дают специальный файл с описанием синтаксиса на спец. языке, а он в ответ порождает парсер с этого языка (в виде программы на ANSI C).
Спасибо за совет. Но думаю тут не стоит использовать эти технологиии, т.к. задача стоит не написать мощный XML парсер, а скорее XML парсер упрощенный, подогнанный под конкретную задачу. Для разбора небольших частей XML, скажем, такой кусок нужно разобрать:

Код: Выделить всё

<stream>
  <msg id="10">
    Some message
  </msg>
</stream>
Что-то типа этого. Т.е. тут как мне кажется задействовать что-то очень серьезное - не стоит :) .
DeeJayC
Сообщения: 492
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

25 янв 2005, 17:31

Ты часом не TIQS API реализуешь?
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
ip
Сообщения: 7
Зарегистрирован: 12 янв 2005, 03:54
Контактная информация:

26 янв 2005, 05:46

Да нет :)
Ответить