Spec-Zone.ru › Qt 5.6

Интерфейс 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. Найдены данные (т.е. текст) «A quotation.».
  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 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 сообщает об атрибутах пространства имён, если функция 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/archives/qt-5.6/xml-sax.html

Spec-Zone.ru

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