Spec-Zone.ru › Qt 5.15

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

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

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

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

<document>
  <book>
    <title>Книга примеров</title>
    <author>Автор</author>
  </book>
  <chapter>
    <title>Введение</title>
  </chapter>
</document>

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

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

<document>
  <book xmlns="http://www.example.com/fnord/book/">
    <book:title>Книга примеров</book:title>
    <author>Автор</author>
  </book>
  <chapter>
    <title>Введение</title>
  </chapter>
</document>

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

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

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

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

<document xmlns="http://www.example.com/fnord/">

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

<document xmlns="http://www.example.com/fnord/" xmlns:book="http://www.example.com/fnord/book/">

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

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

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

Давайте проясним это на примере:

<document xmlns="http://www.example.com/fnord/" xmlns:book="http://www.example.com/fnord/book/">
  <book>
    <book:author title="Имя" name="Фамилия"></book:author>
    <book:title>Книга примеров</book:title>
  </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.

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

Spec-Zone.ru

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