[XML Processing]
[Next: XML Streaming]
Введение в пространства имён
Части документации модуля 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. Если вы хотите обработать этот элемент, вы столкнётесь с проблемами, потому как каждый из titles должен отображаться по-разному - не смотря на то, что они имеют одно название.
Решение заключается в том, чтобы отметить первый title как название кники, то есть использовать элемент title с пространством имён и отличить его от, например, названий главы и т.д.:
<book:title>Practical XML</book:title>
book в этом случае является префиксом prefix, обозначающий пространство имён.
До того, как мы применим пространство имён к элементу или атрибуту, мы должны его объявить.
Namespaces are URIs like http://www.example.com/fnord/book/. Это не означает, что данные должны быть доступны по данному адресу; URI используется просто для обеспечения уникальности имени.
Мы объявляем пространство имён подобно атрибутам; строго говоря, они и являются являются атрибутами. To make for example http://www.example.com/fnord/ the document's default XML namespace xmlns we write
xmlns="http://example.com/fnord/"
To distinguish the http://www.example.com/fnord/book/ namespace from the default, we must supply it with a prefix:
xmlns:book="http://example.com/fnord/book/"
Подобным образом объявленное пространство имён может быть к именам элементов и атрибутов с помощью префикса и разделителя ":". Мы можем увидеть это в элементе book:title.
Элемент с именем без префикса относится к пространству имён по умолчанию. Это правило не применяется для атрибутов: атрибут без префикса не принадлежит ни к одному из объявленных пространств имён 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 мы определили два пространства имён. The default namespace http://www.example.com/fnord/ applies to the book element, the chapter element, the appropriate title element and of course to document itself.
The book:author and book:title elements belong to the namespace with the URI http://www.example.com/fnord/book/.
Два атрибута book:author (title и name) не имеют присвоенных пространств имён XML. Они являются частью "традиционного" пространства имён элемента book:author, это означает, что, например, использование двух атрибутов title в book:author запрещено.
In the above example we circumvent the last rule by adding a title attribute from the http://www.example.com/fnord/ namespace to book:author: the fnord:title comes from the namespace with the prefix fnord that is declared in the book:author element.
Очевидно, что пространство имён fnord имеет то же URI, что и пространство имён по умолчанию. Итак, почему мы просто не используем пространство имён по умолчанию, которое мы объявили? Ответ на этот вопрос довольно сложен:
- атрибуты без префикса не принадлежат ни одному из пространств имён, в том числе и пространству имён по умолчанию;
- кроме того, применение префикса приведёт к конфликту 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 пространства имён ("Уникальный идентификатор ресурса") является уникальным идентификатором пространства имён. It looks like a URL (e.g. http://www.example.com/fnord/ ) but does not require data to be accessible by the given protocol at the named address.
Элементы без ":" (например, chapter в примере) не имеют префикса пространства имён. В этом случае локальное и полное имя совпадают (т.е. равны chapter).
Смотрите также Пример "DOM Bookmarks" и Пример "SAX Bookmarks".
[XML Processing]
[Next: XML Streaming]
Авторские права © 2010 Nokia Corporation и/или её дочерние компании |
Торговые марки |
Qt 4.6.4 |
|