Интерфейс SAXSAX - это стандартный, основанный на событиях интерфейс для анализаторов XML. В вопросе интерфейса Qt следует версии SAX2 реализации Java. Её схема именования была адаптирована в соответствии с требованиями Qt. Подробности о SAX2 можно узнать на http://www.saxproject.org. Поддержка фильтров SAX2 и фабрики читателей находится в стадии разработки. Реализация Qt не включает классов совместимости с SAX1, представленных в интерфейсе Java. Введение в SAX2Интерфейс SAX2 представляет собой событийно-ориентированный механизм для обеспечения пользователя информацией о документе. Под "событием" в этом контексте подразумевается какое-либо сообщение от анализатора, например, встретился начальный тег, или конечный и т.д. Чтобы сделать объяснение менее абстрактным, рассмотрим следующий пример: <quote>A quotation.</quote> В процессе чтения (в SAX2 анализатор обычно называют "читатель") этого документа произойдёт три события:
Каждый раз, когда происходит это событие, анализатор сообщает об этом; вы можете установить свои обработчики этих событий. Хотя этот способ чтения XML документов является быстрым и простым, манипулирование является сложным, потому что данные не сохраняются, а просто обрабатываются и отбрасываются порциями. Интерфейс DOM читает и сохраняет целый документ в виде древовидной структуры; это требует больших затрат памяти, но делает более простым процесс манипулирования структурой документа. Модуль Qt XML обеспечивает абстрактный класс QXmlReader, который определяет интерфейс для потенциальных SAX2 читателей. Qt включает реализацию читателя QXmlSimpleReader, который легко адаптировать под себя с помощью наследования. Читатель сообщает о событиях обработки через специальный класс управления:
Эти абстрактные классы описывают интерфейс Класс QXmlDefaultHandler обеспечивает реализацию по умолчанию для всех обработчиков, которая ничего не делает. Потому пользователям необходимо только перегрузить те функции QXmlDefaultHandler, которые им необходимы. Для чтения входящих XML данных используется специальный класс QXmlInputSource. В отличие от вышеупомянутых классов, данный класс поддержки SAX2 обеспечивает дополнительные удобные функции:
Пример "SAX Bookmarks" показывает, как подкласс QXmlDefaultHandler используется для чтения XML файлов закладок (XBEL) и как создаётся XML вручную. Особенности SAX2Поведение XML читателя зависит от его поддержки некоторых дополнительных возможностей. Например, читатель может иметь функцию "сообщать об атрибутах, использующих декларации пространства имён и префиксов наряду с локальным именем тега". Как и любая другая функциональность, эта имеет свой уникальных идентификатор, представленный в виде URI: он выглядит так http://xml.org/sax/features/namespace-prefixes. Реализация Qt SAX2 может сообщать, какая функциональность поддерживается читателем, с помощью функции QXmlReader::hasFeature(). Доступные функции могут быть проверены с помощью QXmlReader::feature() и выключены или включены посредством QXmlReader::setFeature(). Рассмотрим пример <document xmlns:book = 'http://example.com/fnord/book/' xmlns = 'http://example.com/fnord/' > Читатель, который не поддерживает функцию http://xml.org/sax/features/namespace-prefixes, сообщит об имени элемента document, но не сообщит про его атрибуты xmlns:book xmlns и их значения. Читатель с поддержкой http://xml.org/sax/features/namespace-prefixes сообщит об этих атрибутах, если функция включена. Другие функции состоят в http://xml.org/sax/features/namespace (обработка пространств имён, включающая http://xml.org/sax/features/namespace-prefixes) и http://xml.org/sax/features/validation (способность сообщать об ошибках проверки). Хотя SAX2 оставляет возможность пользователю определять и осуществлять любые функции, требуется, чтобы поддержка http://xml.org/sax/features/namespace (и http://xml.org/sax/features/namespace-prefixes) была важнее. Реализация QXmlSimpleReader QXmlReader, поддерживает их, потому может обрабатывать пространства имён. QXmlSimpleReader не производит проверок, потому не поддерживает http://xml.org/sax/features/validation. Особенности поддержки пространств именКак говорилось выше, мы можем настраивать поведение читателя при обработке пространств имён. Это происходит с помощью включения или отключения http://xml.org/sax/features/namespaces и http://xml.org/sax/features/namespace-prefixes функций. В частности, они влияют на поведение обработчика следующим образом:
Рассмотрим следующий элемент: <author xmlns:fnord = 'http://example.com/fnord/' title="Ms" fnord:title="Goddess" name="Eris Kallisti"/> С http://xml.org/sax/features/namespace-prefixes, установленной в true, читатель сообщио о четырёх атрибутах; а с функцией namespace-prefixes, установленной в false, только о трёх, атрибут с пространством имён xmlns:fnord не будет замечен читателем. Функция http://xml.org/sax/features/namespaces отвечает за сообщение о локальных именах, префиксах пространств имён и URI. С http://xml.org/sax/features/namespaces установленной в true, анализатор будет сообщать о title, как о локальном имени атрибута fnord:title, о fnord, как о префиксе, и о http://example.com/fnord/, как о URI пространства имён. Когда http://xml.org/sax/features/namespaces установлена в false, ни об одном из них не было бы сообщено. В текущей реализации Qt XML классов соблюдается определение, что префикс xmlns сам по себе не ассоциирован с каким-либо пространством имён вовсе (смотрите http://www.w3.org/TR/1999/REC-xml-names-19990114/#ns-using). Потому когда http://xml.org/sax/features/namespaces и http://xml.org/sax/features/namespace-prefixes обе установлены в true, читатель не будет возвращать локальное имя, префикс и URI пространства имён для xmlns:fnord. Это может быть изменено в будущем, в соответствии с советом W3C http://www.w3.org/2000/xmlns/ ассоциировать xmlns с пространством имён http://www.w3.org/2000/xmlns. Как полагает стандарт SAX2, QXmlSimpleReader по умолчанию имеет http://xml.org/sax/features/namespaces, установленным в true, и http://xml.org/sax/features/namespace-prefixes, установленным в false. Когда вы изменяете это поведение, используя QXmlSimpleReader::setFeature(), помните, что установка комбинации обоих функций в false является неверной. РезюмеQXmlSimpleReader включает следующее поведение:
Поведение помеченных звёздочкой (*) не определено в SAX. СвойстваСвойства являются более общим понятием Они имеют уникальное имя, представленное как URI, но их значение - void*. Таким образом, почти всё можно использовать в качестве значения свойств. Эта концепция несколько опасна: нет средств обеспечения безопасности типа; пользователь должен сам заботиться о выборе правильного типа. Свойства наиболее полезны, если читатель поддерживает специальные классы обработки. URI, используемые для свойств, обычно выглядят как URL, т.е. http://xml.org/sax/features/namespace. Это не означает, что данные должны быть доступны по данному адресу. Это просто способ задания уникального имени. Кто угодно может определить и использовать новые свойства SAX2 в своих читателях. Но поддержка свойств не является обязательной. Для реализации поддержки свойств необходимо определить следующие функции: QXmlReader::setProperty(), QXmlReader::property() и QXmlReader::hasProperty(). |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |