Rambler's Top100 Service калинин.ru / программирование / xml /  << 27.09.00 >>

Средства для разбора XML-файлов

С момента последнего обновления в этом разделе прошло уже больше месяца... но ведь никто же никому ничего не обещал? ;) Тем не менее, как это ни странно, раздел про XML почему-то пользуется популярностью среди посетителей моей странички. Для меня это несколько удивительно, хотя я догадываюсь, почему: слово очень модное. Но хватит лирики.

Для того, что бы написать приложение, которое использует XML в качестве формата для хранения своих данных, требуется некоторое средство, которое поможет работать с этим форматом. Вообще говоря, обработка XML обычно достаточна в конкретных приложениях. То есть, обычно формат данных получается несложным и с задачей разбора может справиться даже человек, который не знаком с теорией формальных грамматик.

Но в общем случае, в формате XML содержится очень большое количество различных нюансов, обработка которых в своей программе прибавляет много несложной работы программисту (в основном, связанной с тестированием). Поэтому появились специализированные средства (программные библиотеки) призванные облегчить жизнь программистам, которые хотят использовать XML в качестве формата передачи данных.

В различных каталогах программного обеспечения эти средства называются XML parsers (понятно почему) и в последнее время их появилось достатчно много.

В этой заметке я просто опишу традиционные интерфейсы к XML parser'ам и кратко остановлюсь на конкретных названиях.

Обычно, parser'ы делятся на три типа:

  • разбирающие входной поток во внутреннее представление документа (дерево), DOM-модель.
  • генерериующие события при обработке соответствующих синтаксических элементов, SAX-интерфейс.
  • генерериуемые parser'ы для разбора документов, соответствующих конкретным XML-словарям.

Обработчики первого типа по заданному XML-файлу создают дерево, представляющее иерархическую структуру документа. Такой подход к разбору позволяет проверить документ на соответствие своему DTD (document type definition, набор правил, по которым должен быть построен документ). Это дает возможность не обрабатывать документ, если он неправильно оформлен. После окончания разбора необходимо реализовать обход полученного дерева для получения информации из него.

Обработчики второго типа во время разбора синтаксических конструкций генерируют события, на которые приложение может реагировать как ему заблагорассудится. Такой подход более быстрый, чем построение дерева документа и более простой для приложения (потому что не надо реализовывать обход дерева самостоятельно), но не позволяет до передачи информации приложению указать на правильность документа. Это неприятно, потому что тогда придется учитывать откаты в случае неверных документов, но иногда терпимо. SAX-интерфейс (от названия первого parser'а, в котором была применена эта модель разбора), в принципе, удобнее для программиста, чем DOM.

Третий тип обработчиков является самым быстрым потому что программный код генерируется для конкретного DTD и не тратит время на разбор ненужных синтаксических конструкций. Фактически, очень удобно для приложений, которые используют ограниченное количество форматов входных файлов, тогда можно автоматически сгенерировать все обработчики, каждый из которых будет работать очень быстро.

При выборе parser'а особое внимание надо обратить на то, какие кодировки входного текста он понимает. Все дело в том, что в нашей стране, по понятным причинам, очень часто встречается кириллица. А все доступные parser'ы написаны "за рубежом" и, хотя интернациональность заложена в стандарт XML, не все создатели программного обеспечения придерживаются этой идеологии.

Вполне удовлетворительно, если parser будет поддерживать, кроме Latin-1, UTF-8 или UTF-16. Единственное, вероятно что вам придется написать какие-то свои перекодировщики из вашей любимой кодировки в Unicode, но поддержка UTF обычно снимает все проблемы, связанные с национальными символами. Хотя, опять же, многие авторы Parser'ов по своему воспринимают UTF и применяют к нему какие-то свои фильтры; в общем, тут придется эксперементировать.

Кодировки типа koi8 или windows-1251 поддерживаются ограниченным числом parser'ов. Фактически, их можно пересчитать по пальцам (что мы и сделаем чуть ниже).

Parser'ы доступны практически для любых языков программирования, но особенно их много для Java. Я на Java не пишу, так что ничего не могу сказать об их качестве.

Таким образом, далее речь пойдет о parser'ах для C++.

Самым известным является expat от J. Clark'а. Поддерживает Unicode, очень стабилен в работе. Используется в Netscape и libwww для разбора XML-документов. Не позволяет проверить корректность документа.

Кстати, у того же автора есть SGML parser под названием SP, который так же можно использовать для разбора XML-документов. И если expat написан имеет интерфейс на C, то SP --- на C++.

MS XML SDK. Этот parser на сегодняшний день, пожалуй, поддерживает самое большое количество кодировок; он используется в Internet Explorer. Реализует DOM и SAX интерфейсы, позволяет проверить корректность входного документа. Среди недостатков можно отметить то, что он предназначен для использования только на платформе Win32 и что он до сих пор находится в состоянии Beta. Причем, "бета" еще можно было бы терпеть, если бы компания Microsoft действительно не реализовывала свои угрозы, и не изменяла бы интерфейс от "беты" к "бете". Причем, изменения достаточно маразматические, на мой взгляд: например, при переходе с майской на июньскую "бету" (если я не наврал с месяцами) в SAX-интерфейсе названия методов поменяли первую "большую" букву на соответствующую "маленькую". Так что, будьте готовы к этому, если соберетесь его использовать. Правда, DOM-модель уже достаточно статична в своем интерфейсе, но ошибки... ошибки в нем есть. На то и "бета".

Parser от фирмы Oracle. Доступен для множества языков программирования, включая C и C++. Честно говоря, сам я его не пробовал использовать, но по описанию он понимает такие кодировки, как, например, koi8, что не может не радовать. Доступн для платформ MS Windows и многих Unix'ов.

flexml является генератором кода на C, который распознает документы, соответствующие конкретному DTD. Опять же, к моему сожалению, я узнал о его существовании уже после того, как выбрал parser для моего последнего проекта, в котором использовался XML в качестве средства обмена данными, так что я не имею опыта практического использования этой программы. Тем не менее, вещь достаточно полезная и, наверняка, подходящая для большинства программ, работающих с XML.

Вообще говоря, parser'ов очень много. Если вам не подходит ни один из вышеперечисленных, то вы можете найти еще какие-нибудь в каталогах программного обеспечения для XML, возможно найдете что-то себе по душе.

Резюме

Использовать XML в своих программах очень просто. Для этого достаточно придумать себе словарь DTD, выбрать parser и... в общем-то, все. Это очень приятно, потому что позволяет практически безо всяких трудозатрат реализовать удобный формат для обмена данными.

Именно поэтому XML и становится таким популярным --- простота использования и наличие большого количества средств обработки.


Версия для печати


  Ссылки по теме:
http://www.jclark.com/xml/expa
   expat --- XML parser toolkit.
http://www.jclark.com/sp/
   SP --- SGML parser.
http://msdn.microsoft.com/xml/
   Раздел MSDN, посвященный XML. Отсюда можно скачать MS XML SDK.
http://technet.us.oracle.com/t
   Раздел на Oracle TechNet, посвященный XML. Здесь находится XML parser для C++, скачать который можно после регистрации.
http://www.ens-lyon.fr/~krisro
   FleXML --- XML Processor Generator.
http://www.xmlsoftware.com
   XMLSoftware --- набор ссылок на программное обеспечение для работы с XML. Есть и XML parsers.
  Рядом в разделе:
HTML must die (18.11.00)
   Язык гипертекстовой разметки документов (HTML) используется сейчас повсеместно. Задачи, которые ставились перед создателями этого языка заключались в необходимости создания универсального формата...   >>>>
Преобразование XML при помощи XSL (11.08.00)
   Одна из самых частых операций, которую требуется произвести с XML-документом, это показать его. Хочется предупредить сразу, что на этот раз я...   >>>>
  Рядом по дате:
Критика правил олимпиад ACM (28.09.00)
   Вы знаете, самое смешное заключается в том, что я уверен в полной практической бесполезности навыков, которые были мной получены на олимпиадах....   >>>>
free.rambler.ru, свободный доступ в интернет (26.09.00)
   На начали наконец-то мелькать баннеры нового Рамблеровского проекта под названием Rambler-FreeNet. Суть его достаточно проста: Рамблер предоставляет относительно свободный доступ в...   >>>>
  Содержание:
Заглавная страница
Мой блог
Мое резюме
Дайджест
Программирование
   C&C++
Сети
Unix
Алгоритмы
Оптимизация
Соревнования
Отвлеченно
XML
TeX
Просто так
Студенческое
Туризм
  Байки
Фотографии
Комментарии
   Книги
Web-ресурсы
Фильмы
Интернет
Программное обеспечение
Жизнь
Благодарности
Форум
Хронология
 
  В этом разделе:
HTML must die (18.11.00)
   Язык гипертекстовой разметки документов (HTML) используется сейчас повсеместно. Задачи, которые ставились перед создателями этого языка заключались в необходимости создания универсального формата...   >>>>
Средства для разбора XML-файлов (27.09.00)
   С момента последнего обновления в этом разделе прошло уже больше месяца... но ведь никто же никому ничего не обещал? ;) Тем...   >>>>
Преобразование XML при помощи XSL (11.08.00)
   Одна из самых частых операций, которую требуется произвести с XML-документом, это показать его. Хочется предупредить сразу, что на этот раз я...   >>>>
Зачем же все-таки нужен XML (02.08.00)
   XML сейчас является очень модным словом --- обычно вместе с его упоминанием встречаются слова "метаязык", "перспективная технология" и прочее. Вообще, как...   >>>>
Содержание раздела полностью...
   Примерно в тоже время
Критика правил олимпиад ACM (28.09.00)
   Вы знаете, самое смешное заключается в том, что я уверен в полной практической бесполезности навыков, которые были мной получены на олимпиадах....   >>>>
free.rambler.ru, свободный доступ в интернет (26.09.00)
   На начали наконец-то мелькать баннеры нового Рамблеровского проекта под названием Rambler-FreeNet. Суть его достаточно проста: Рамблер предоставляет относительно свободный доступ в...   >>>>
Хронология полностью...
   Содержание
Заглавная страница
Мой блог
Мое резюме
Дайджест
Программирование
  C&C++
Сети
Unix
Алгоритмы
Оптимизация
Соревнования
Отвлеченно
XML
TeX
Туризм
  Байки
Фотографии
Комментарии
  Книги
Web-ресурсы
Фильмы
Интернет
Программное обеспечение
Жизнь
Студенческое
Просто так
Благодарности
Форум
Хронология
© 2000-2008, Andrey L. Kalinin
mailto:andrey@kalinin.ru
Rambler's Top100