Spec-Zone.ru › Qt 5.12

Интерфейс 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 SAX Bookmarks Example иллюстрирует, как наследоваться от 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.12/xml-sax.html

Spec-Zone.ru

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