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