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