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