Средства для разбора XML-файловС момента последнего обновления в этом разделе прошло уже больше месяца... но ведь никто же никому ничего не обещал? ;) Тем не менее, как это ни странно, раздел про XML почему-то пользуется популярностью среди посетителей моей странички. Для меня это несколько удивительно, хотя я догадываюсь, почему: слово очень модное. Но хватит лирики. Для того, что бы написать приложение, которое использует XML в качестве формата для хранения своих данных, требуется некоторое средство, которое поможет работать с этим форматом. Вообще говоря, обработка XML обычно достаточна в конкретных приложениях. То есть, обычно формат данных получается несложным и с задачей разбора может справиться даже человек, который не знаком с теорией формальных грамматик. Но в общем случае, в формате XML содержится очень большое количество различных нюансов, обработка которых в своей программе прибавляет много несложной работы программисту (в основном, связанной с тестированием). Поэтому появились специализированные средства (программные библиотеки) призванные облегчить жизнь программистам, которые хотят использовать XML в качестве формата передачи данных. В различных каталогах программного обеспечения эти средства называются XML parsers (понятно почему) и в последнее время их появилось достатчно много. В этой заметке я просто опишу традиционные интерфейсы к XML parser'ам и кратко остановлюсь на конкретных названиях. Обычно, parser'ы делятся на три типа:
Обработчики первого типа по заданному 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 и становится таким популярным --- простота использования и наличие большого количества средств обработки.
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
© 2000-2008, Andrey L. Kalinin mailto:andrey@kalinin.ru |
|