Spec-Zone.ru › Qt 5.14

Интерфейс SAX

SAX — это стандартный интерфейс на основе событий для парсеров XML. Интерфейс Qt следует структуре реализации SAX2 Java. Его схема именования была адаптирована для соответствия соглашениям об именовании Qt. Подробности о SAX2 можно найти по адресу http://www.saxproject.org.

Поддержка фильтров SAX2 и фабрики читателей находится в разработке. Реализация Qt не включает классы совместимости SAX1, присутствующие в Java-интерфейсе.

Введение в SAX2

Интерфейс SAX2 — это механизм обработки событий, предоставляющий пользователю информацию об документе. «Событие» в этом контексте означает что-то, сообщённое парсером, например, он встретил открывающий тег или закрывающий тег и т.д.

Для большей наглядности рассмотрим следующий пример:

<quote>A quotation.</quote>

При чтении (парсер SAX2 обычно называется «читатель») вышеуказанного документа будут вызваны три события:

  1. Происходит открывающий тег (<quote>).
  2. Найдены данные символов (т.е. текст), «Цитата».
  3. Обработан закрывающий тег (</quote>).

Каждый раз, когда такое событие происходит, парсер о нём сообщает; вы можете настроить обработчики событий для реакции на эти события.

Хотя это быстрый и простой подход к чтению XML-документов, манипулирование ими затруднено, так как данные не хранятся, а просто обрабатываются и последовательно отбрасываются. Интерфейс DOM считывает и хранит весь документ в структуре дерева; это требует больше памяти, но упрощает манипулирование структурой документа.

Модуль Qt XML предоставляет абстрактный класс QXmlReader, который определяет интерфейс для потенциальных читателей SAX2. Qt включает реализацию читателя QXmlSimpleReader, которую легко адаптировать через наследование.

Читатель сообщает о событиях разбора через специальные обработчики классов:

Класс обработчика Описание
QXmlContentHandler Сообщает о событиях, связанных с содержимым документа (например, с открывающим тегом или символами).
QXmlDTDHandler Сообщает о событиях, связанных с DTD (например, объявлениями нотаций).
QXmlErrorHandler Сообщает об ошибках или предупреждениях, возникших во время разбора.
QXmlEntityResolver Сообщает о внешних сущностях во время разбора и позволяет пользователям разрешать внешние сущности самостоятельно, а не оставлять это читателю.
QXmlDeclHandler Сообщает о дополнительных событиях, связанных с DTD (например, объявлениях атрибутов).
QXmlLexicalHandler Сообщает о событиях, связанных с лексической структурой документа (началом DTD, комментариями и т. д.).

Эти классы являются абстрактными классами, описывающими интерфейс. Класс QXmlDefaultHandler предоставляет реализацию по умолчанию «ничего не делать» для всех из них. Поэтому пользователям нужно только переопределить функции QXmlDefaultHandler, которые их интересуют.

Для чтения входных XML-данных используется специальный класс QXmlInputSource.

Помимо уже упомянутых, следующие классы поддержки SAX2 предоставляют дополнительную полезную функциональность:

Класс Описание
QXmlAttributes Используется для передачи атрибутов в событии начала элемента.
QXmlLocator Используется для получения фактического положения разбора события.
QXmlNamespaceSupport Используется для реализации поддержки пространств имен для читателя. Обратите внимание, что пространства имён не изменяют поведение разбора. Они просто сообщаются через обработчик.

Пример SAX Закладки Примеры SAX Закладок демонстрирует, как наследоваться от QXmlDefaultHandler, чтобы читать файл закладок XML (XBEL) и как создавать XML вручную.

Функции SAX2

Поведение читателя XML зависит от его поддержки определённых необязательных функций. Например, читатель может иметь функцию «сообщать об атрибутах, используемых для объявлений пространств имён и префиксов вместе с локальным именем тега». Как и любая другая функция, у неё есть уникальное имя, представленное URI: оно называется http://xml.org/sax/features/namespace-prefixes.

Реализация SAX2 Qt может сообщать, обладает ли читатель конкретной функциональностью, используя функцию 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 сообщает об атрибутах пространства имён, если функция feature включена.

Другие функции включают 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.

Они влияют на поведение отчётности следующим образом:

  1. Префиксы и локальные части элементов и атрибутов могут быть сообщены.
  2. Квалифицированные имена элементов и атрибутов сообщаются.
  3. Читатель вызывает QXmlContentHandler::startPrefixMapping() и QXmlContentHandler::endPrefixMapping().
  4. Атрибуты, которые объявляют пространства имён (т.е. атрибут xmlns и атрибуты, начинающиеся с xmlns:), сообщаются.

Рассмотрим следующий элемент:

<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 реализует следующее поведение:

(namespaces, namespace-prefixes) Префикс и локальная часть пространства имён Квалифицированные имена Сопоставление префиксов Атрибуты xmlns
(true, false) Да Да* Да Нет
(true, true) Да Да Да Да
(false, true) Нет* Да Нет* Да
(false, false) Недопустимо

Поведение записей, помеченных звёздочкой (*), не определено в SAX.

Свойства

Свойства — более общее понятие. У них есть уникальное имя, представленное URI, но их значение void*. Таким образом, в качестве значения свойства может использоваться практически всё. Тем не менее, это понятие связано с определённой опасностью: нет способа гарантировать безопасность типов; пользователь должен позаботиться о том, чтобы передавать правильный тип. Свойства полезны, если читатель поддерживает специальные обработчики классов.

URI, используемые для функций и свойств, часто выглядят как URL-адреса, например http://xml.org/sax/features/namespace. Это не означает, что необходимые данные находятся по этому адресу. Это просто способ определения уникальных имён.

Любой может определить и использовать новые свойства SAX2 для своих читателей. Поддержка свойств не является обязательной.

Для установки или запроса свойств предоставляются следующие функции: QXmlReader::setProperty(), QXmlReader::property() и QXmlReader::hasProperty().

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/xml-sax.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API