Введение в пространства имен
Некоторые части документации модуля 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.9/xml-namespaces.html