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