Spec-Zone.ru › Qt 5.13

Введение в пространства имён

Некоторые части документации модуля Qt XML предполагают, что вы знакомы с пространствами имён XML. Здесь мы представим краткое введение; переходите к конвенциям документации Qt XML, если вы уже знаете эту информацию.

Пространства имён — это концепция, введённая в XML для более модульного дизайна. С их помощью программное обеспечение для обработки данных может легко разрешать конфликты имён в документах XML.

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

<document>
<book>
  <title>Practical XML</title>
  <author title="Ms" name="Eris Kallisti"/>
  <chapter>
    <title>A Namespace Called fnord</title>
  </chapter>
</book>
</document>

Здесь мы находим три различных использования имени title. Если вы хотите обработать этот документ, у вас возникнут проблемы, потому что каждое из title должно отображаться по-разному — даже если они имеют одинаковое имя.

Решение заключалось бы в том, чтобы иметь возможность идентифицировать первое вхождение title как заголовок книги, т.е. использовать элемент title пространства имён книги, чтобы отличить его, например, от заголовка главы, например:

<book:title>Practical XML</book:title>

book в этом случае является префиксом, обозначающим пространство имён.

Прежде чем мы сможем применить пространство имён к именам элементов или атрибутов, мы должны его объявить.

Пространства имён — это URI, такие как http://www.example.com/fnord/book/. Это не означает, что данные должны быть доступны по этому адресу; URI просто используется для предоставления уникального имени.

Мы объявляем пространства имён так же, как атрибуты; строго говоря, они являются атрибутами. Чтобы сделать, например, http://www.example.com/fnord/ стандартным пространством имён XML документа xmlns, мы пишем

xmlns="http://example.com/fnord/"

Чтобы отличить пространство имён http://www.example.com/fnord/book/ от стандартного, мы должны предоставить ему префикс:

xmlns:book="http://example.com/fnord/book/"

Пространство имён, объявленное таким образом, можно применить к именам элементов и атрибутов, добавив соответствующий префикс и разделитель ":". Мы уже видели это с элементом book:title.

Имена элементов без префикса относятся к стандартному пространству имён. Это правило не относится к атрибутам: атрибут без префикса не принадлежит ни одному из объявленных пространств имён XML вообще. Атрибуты всегда принадлежат «традиционному» пространству имён элемента, в котором они появляются. «Традиционное» пространство имён — это не пространство имён XML, это просто означает, что все имена атрибутов, принадлежащие одному элементу, должны быть различными. Позже мы увидим, как назначить пространству имён XML атрибут.

Из-за того, что атрибуты без префиксов не находятся ни в каком пространстве имён XML, нет конфликта между атрибутом title (который принадлежит элементу author) и, например, элементом title в chapter.

Давайте уточним это на примере:

<document xmlns:book = 'http://example.com/fnord/book/'
          xmlns      = 'http://example.com/fnord/' >
<book>
  <book:title>Practical XML</book:title>
  <book:author xmlns:fnord = 'http://example.com/fnord/'
               title="Ms"
               fnord:title="Goddess"
               name="Eris Kallisti"/>
  <chapter>
    <title>A Namespace Called fnord</title>
  </chapter>
</book>
</document>

Внутри элемента document объявлены два пространства имён. Стандартное пространство имён http://www.example.com/fnord/ применяется к элементу book, элементу chapter, соответствующему элементу title и, конечно, к самому элементу document.

Элементы book:author и book:title принадлежат пространству имён с URI http://www.example.com/fnord/book/.

Два атрибута book:author title и name не имеют назначенного пространства имён XML. Они являются только членами «традиционного» пространства имён элемента book:author, что означает, что, например, два атрибута title в book:author запрещены.

В приведенном выше примере мы обходим последнее правило, добавляя атрибут title из пространства имён http://www.example.com/fnord/ к book:author: fnord:title происходит из пространства имён с префиксом fnord, которое объявлено в элементе book:author.

Очевидно, что пространство имён fnord имеет тот же URI пространства имён, что и стандартное пространство имён. Так почему же мы не использовали просто стандартное пространство имён, которое мы уже объявили? Ответ довольно сложный:

  • атрибуты без префикса вообще не принадлежат никакому пространству имён XML, даже не стандартному;
  • кроме того, опускание префикса приведёт к конфликту title-title;
  • написание его как xmlns:title объявит новое пространство имён с префиксом title вместо применения стандартного пространства имён xmlns.

С помощью классов Qt XML элементы и атрибуты могут быть доступны двумя способами: либо ссылаясь на их полные имена, состоящие из префикса пространства имён и «реального» имени (или локального имени), либо сочетая локальное имя и URI пространства имён.

Дополнительную информацию о пространствах имён XML можно найти по адресу http://www.w3.org/TR/REC-xml-names/.

Конвенции, используемые в документации Qt XML

Следующие термины используются для различения частей имён в контексте пространств имён:

  • Полное имя — это имя, как оно отображается в документе. (В приведенном выше примере book:title — это полное имя.)
  • Префикс пространства имён в полном имени — это часть слева от ":". (book — это префикс пространства имён в book:title.)
  • Локальная часть имени (также называемая локальным именем) появляется справа от ":". (Таким образом, title — это локальная часть book:title.)
  • URI пространства имён («Универсальный идентификатор ресурса») — это уникальный идентификатор пространства имён. Он выглядит как URL (например, http://www.example.com/fnord/), но не требует, чтобы данные были доступны по указанному протоколу по указанному адресу.

Элементы без «:» (например, chapter в примере) не имеют префикса пространства имён. В этом случае локальная часть и полное имя совпадают (т.е. chapter).

См. также Пример закладок DOM и Пример закладок SAX.

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

Spec-Zone.ru

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