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