[Предыдущая: Потоки XML] [Обработка XML] [Следующая: Работа с деревом DOM] Интерфейс SAX
|
Классы обработки | Описание |
---|---|
QXmlContentHandler | Сообщает о событиях, связанных с содержимым документа (например, начало тега или какие-либо символы). |
QXmlDTDHandler | Сообщает о событиях, связанных с DTD (например, декларации нотации). |
QXmlErrorHandler | Сообщает об ошибках или предупреждениях, которые возникают в процессе анализа. |
QXmlEntityResolver | Сообщает о внешних сущностях, которые встречаются при разборе документа, это позволяет пользователям самостоятельно разрешать внешние сущности, а не оставлять это анализатору. |
QXmlDeclHandler | Сообщает о дальнейших связанных с DTD событиях (например, декларации атрибута). |
QXmlLexicalHandler | Сообщает о событиях, связанных с лексической структурой документа (начало DTD, комментарии и т.д.). |
Эти абстрактные классы описывают интерфейс Класс QXmlDefaultHandler обеспечивает реализацию по умолчанию для всех обработчиков, которая ничего не делает. Потому пользователям необходимо только перегрузить те функции QXmlDefaultHandler, которые им необходимы.
Для чтения входящих XML данных используется специальный класс QXmlInputSource.
В отличие от вышеупомянутых классов, данный класс поддержки SAX2 обеспечивает дополнительные удобные функции:
Класс | Описание |
---|---|
QXmlAttributes | Используется для передачи атрибутов при событии начала элемента. |
QXmlLocator | Используется для определения текущей позиции анализатора при событии. |
QXmlNamespaceSupport | Используется для реализации поддержки пространства имён для читателя. Помните, что пространства имён не изменяют поведения анализатора. О них всего лишь сообщается через обработчик. |
Пример "SAX Bookmarks" показывает, как подкласс QXmlDefaultHandler используется для чтения XML файлов закладок (XBEL) и как создаётся XML вручную.
Поведение 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 включает следующее поведение:
(пространства имён, префиксы пространств имён) | Префикс пространства имён и локальная часть | Полные имена | Преобразование префиксов | Атрибуты xmlns |
---|---|---|---|---|
(true, false) | Да | Yes* | Да | Нет |
(true, true) | Да | Да | Да | Да |
(false, true) | No* | Да | No* | Да |
(false, false) | Недоступные |
Поведение помеченных звёздочкой (*) не определено в SAX.
Свойства являются более общим понятием Они имеют уникальное имя, представленное как URI, но их значение - void*. Таким образом, почти всё можно использовать в качестве значения свойств. Эта концепция несколько опасна: нет средств обеспечения безопасности типа; пользователь должен сам заботиться о выборе правильного типа. Свойства наиболее полезны, если читатель поддерживает специальные классы обработки.
URI, используемые для свойств, обычно выглядят как URL, т.е. http://xml.org/sax/features/namespace. Это не означает, что данные должны быть доступны по данному адресу. Это просто способ задания уникального имени.
Кто угодно может определить и использовать новые свойства SAX2 в своих читателях. Но поддержка свойств не является обязательной.
Для реализации поддержки свойств необходимо определить следующие функции: QXmlReader::setProperty(), QXmlReader::property() и QXmlReader::hasProperty().
[Предыдущая: Потоки XML] [Обработка XML] [Следующая: Работа с деревом DOM]
Авторские права © 2010 Nokia Corporation и/или её дочерние компании | Торговые марки | Qt 4.6.4 |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |