Пространства имен (Namespaces)

Данная лекция посвящена одному из очень важных, концептуальных вопросов XML технологии, а именно предназначению и использованию пространств имен (Namespace).

1 Проблема неоднозначности использования имен. 1

2. Понятие пространства имен в XML.. 1

3. Задание элементов и атрибутов в пространстве имен. 2

4. Область действия объявлений пространств имен. 4

5. Пример реализации концепции пространства имен. 6

5.1 Пространство имен action для слова "замок" в смысле действия. 6

5.2 Пространство имен building для слова " замок " в смысле здание. 6

5.3 Пространство имен security для слова " замок " в смысле безопасность. 7

5.4 Главное (main) пространство имен. 7

5.5 XML документ. 8

1 Проблема неоднозначности использования имен

XML технология практически не накладывает ограничений на названия элементов, атрибутов и типов.

            Поскольку XML документы могут быть составными, использовать несколько схем, спроектированных разными разработчиками, то возможна проблема неоднозначности имен. В одном XML документе не исключено использование элементов и атрибутов с одинаковыми названиями, но несущими разную смысловую нагрузку.

В русском, английском, да и в других языках часто встречаются омонимы, т.е. слова, которые пишутся одинаково, но имеют разный смысл.

Возьмем известную всем скороговорку: «Запер замок на замок, чтобы замок не замок». В данном тексте слово замок употребляется четыре раза в трех совершенно разных смыслах: а) здание; б) устройство, обеспечивающее защиту от несанкционированного доступа в здание; в) результат, наступающий из-за попадания воды. Человек интуитивно чувствует контекст и понимает, в каком смысле замок используется. Программе, чтобы она разобралась, контекст надо подсказать.

При использовании XML подобные ситуации возникают достаточно часто. Разработчики, за небольшим, оговоренным в XML стандартах количеством комбинаций символов, свободны в выборе названий элементов и атрибутов. Поэтому при объединении XML документов, принадлежащих разным предметным областям возможны конфликты имен.

Чтобы избежать подобные ситуации в XML технологии было введено понятие пространства имен, правила использования которого регламентированы в Рекомендации Namespace in XML 1.0,  разработанной World Wide Web Consortium (W3C). На момент написания данной лекции действует третья редакция от 8 декабря 2009 года. Перевод этой версии Рекомендации можно посмотреть здесь.

2. Понятие пространства имен в XML

Понятие пространства имен не является особенностью XML технологии и появилось значительно раньше. Где бы оно ни использовалось,  общий смысл этого понятия везде примерно один и тот же. Однако принципы задания и "физический" смысл могут существенно отличаться.

Для более четкого понимания принципов задания и использования пространств имен в XML сначала рассмотрим это понятие в программировании, а уже затем снова вернемся к XML.

В программировании способы задания пространства имен в общем случае могут быть двух видов.

Первый способ базируется на представлении предметных областей, связанных в единую иерархическую структуры. В этом случае пространство имен определяет контекстный узел иерархии, а поддерево иерархии, для которого контекстный узел является родителем, и есть текущее пространство имен. Чем ниже мы спускаемся по дереву иерархии, тем более точно задаем пространство имен, уменьшая возможность коллизий из-за возможного совпадения имен. 

Типичным представителем, использующим  такой подход, является иерархия классов .Net при программировании в Windows. Например, для использования классов, обеспечивающих возможности сетевого взаимодействия следует объявить пространство имен System.Net. В нотации языка С# это будет выглядеть следующим образом:

using System.Net;

Если же нам требуется только обмен данными с использованием сокетов, то лучше задать более узкое пространство имен:

using System.Net.Sockets;

Иной способ задания пространств имен используется, когда пространство имен не имеет иерархических взаимосвязей, т.е. представляется плоскими структурами. Такой вид определения пространств имен применяется, например, в языке программирования С++.

Например, чтобы использовать элементы библиотеки STL необходимо в программе объявить пространство имен этой  библиотеки. В нотации языка С++ это будет выглядеть следующим образом:

using namespace std;

В обоих представленных выше способах задания пространств имен вы, как бы, даете разрешение программе на работу с классами (их методами и свойствами), входящими в это пространство имен. Здесь концептуально важно, что за конкретным пространством имен стоит конкретный набор классов.

Теперь вернемся к XML технологии. Согласно определению Рекомендации W3C «Пространство имен XML идентифицируется ссылкой URI [RFC3986]; имена элементов и атрибутов могут размещаться в пространстве имен XML, используя механизмы, описанные в данной спецификации».

Анализируя представленное определение важно отметить следующие моменты:

- в качестве идентификатора пространства имен в XML используется ссылка URI. Не полный путь к контекстному узлу, как в .Net, ни символьный идентификатор, как в С++, а именно ссылка URI;

- ссылка URI это идентификатор характеризующий пространство имен и ничего более, он ни на что не указывает, по его адресу ничего не располагается;

- в .Net и С++ пространства имен включают конкретный набор классов (их методов и свойств).

В XML пространства имен не определяют набор доступных элементов и атрибутов. Это прерогатива схем (DTD, XML Schema). Использование пространств имен в XML позволяет связать имя элемента и атрибута с соответствующим пространством имен, тем самым исключить возможные коллизии имен и подсказать обработчику XML, как правильно интерпретировать XML документ.

3. Задание элементов и атрибутов в пространстве имен

Для обеспечения однозначности понимания, используемых в XML документе имен объектов, используется расширенное имя. Расширенное имя представляет собой пару, состоящую из двух имен: имени пространства имен (в виде ссылки URI), идущего впереди, и локального имени элемента или атрибута в этом пространстве имен.

Поскольку ссылки URI могут быть очень длинными и содержать символы, неразрешенные для использования в именах, то обычно вместо расширенных имен используют полные имена. Полное имя также представляется парой, но вместо имени пространства имен  используется префикс пространства имен. При определенных условиях, о чем будет говориться далее, полное имя может не иметь префикса и состоять только из локального имени объекта.

На имя префикса пространства имен накладываются следующие ограничения:

·         не может иметь значение xml, т.к. это значение зарезервировано за префиксом, привязанным к имени пространства имен http://www.w3.org/XML/1998/namespace;

·         не может иметь значение xmlns, т.к. данное имя зарезервировано за атрибутом  объявления пространств имен;

·         не должно начинаться последовательностью трех символов x, m, l (независимо от регистра).

Для того чтобы задать префикс пространства имен нужно связать этот префикс с пространством имен или, как иногда говорят, объявить пространство имен.

Объявление пространств имен выполняется с помощью специально зарезервированного атрибута xmlns. Синтаксис объявления имеет следующий вид:

xmlns[:prefix]="пространство имен"

где: prefix – префикс, используемый для связывания имен элементов и атрибутов с именем пространства имен;

пространство имен – ссылка URI, идентифицирующая пространство имен.

Например, в представленном ниже примере объявляется пространство имен, идентифицируемое ссылкой URI "http://www.main.ru"  и связанное с префиксом doc.

<?xml version="1.0" encoding="Windiws-1251"?>

<main:document xmlns:doc="http://www.main.ru">

            <doc:section>Раздел 1</doc:section>

            <doc:section>Раздел 2</doc:section>

</doc:document>                                            

При объявлении пространств имен следует иметь в виду следующие правила:

·         в элементе может быть задано несколько пространств имен;

·         только одно из них может быть задано как пространство имен по умолчанию. Пространство имен по умолчанию характеризуется тем, что для него не указывается префикс;

·         если элемент, в котором объявляется пространство имен, входит в это пространство имен, то он указывается с объявленным в нем префиксом;

·         объявление пространства имен может выполняться только в начальном теге элемента;

·         конечный тег элемента также указывается с префиксом пространства имен.

Ниже представлен более сложный пример объявления пространств имен, показывающий реализацию всех указанных правил.

<?xml version="1.0" encoding="Windiws-1251"?>

<doc:document xmlns:doc="http://www.main.ru"

    xmlns:="http://www.authors.ru">

            <doc:section>Раздел 1

                        <authors>

                                   <author>Автор 1<.author>

                                   <author>Автор 2<.author>

                        <authors>

</doc:section>

            <doc:section>Раздел 2

                        <authors>

                                   <author>Автор 2<.author>

                                   <author>Автор 3<.author>

                                   <author>Автор 4<.author>

                        <authors>

</doc:section>

</doc:document>                                            

В представленном примере объявляются два пространства имен, причем второе (http://www.authors.ru) определено как пространство имен по умолчанию, без префикса. В XML  документе элементы document и section, входящие в пространство имен http://www.main.ru, указываются с префиксом doc. Элементы authors и author, входящие в пространство имен http://www.authors.ru, указываются без префикса.

            Следует иметь в виду, что значение URI ссылки пространства имен чувствительно к регистру (собственно, как и имена элементов и атрибутов). Поэтому, указанные ниже три ссылки будут определять разные пространства имен:

·         http://www.authors.ru

·         http://www.Authors.ru

·         http://www.AUTHORS.ru

4. Область действия объявлений пространств имен

Область действия пространства имен может распространяться:

·         на весь документ, когда оно объявлено в корневом элементе документа;

·          на конкретный контейнер и все включенные в него элементы и атрибуты, когда оно объявлено в элементе верхнего уровня контейнера;

·         на отдельный элемент и его атрибуты, когда оно объявлено непосредственно в данном элементе.

Область действия пространства имен по умолчанию определяется аналогичным образом. При этом необходимо помнить следующее. В XML документе может быть действительным только одно пространство имен по умолчанию. Если в области действия пространства имен по умолчанию задается другое пространство имен по умолчанию, то оно отменяет действие ранее объявленного (первого) пространства имен по умолчанию. По окончанию действия второго пространства имен по умолчанию вновь начинает действовать первое пространство имен по умолчанию.

Ниже представлен пример гипотетического XML документа, иллюстрирующий области действия пространств имен. В примере используется несколько элементов protocol, но в зависимости от его расположения в документе, они будут определены в разных пространствах имен и, соответственно, иметь разный смысловой контекст. (Цифры справа не являются частью примера и служат для идентификации строк.)

<?xml version="1.0" encoding="Windows-1251"?>

 1

<net:network xmlns:net="http://www.network.com/lan"

 2

                xmlns="http://www.network.com/server">

 3

            <softlan>

 4

                        <net:protocol> ... </net:protocol>

 5

                        <protocol> ... </protocol>

 6

                        <frm:organization xmlns:frm="http://www.network.com/firm">

 7

                                   <frm:protocol> ... </frm:protocol>

 8

                                   <protocol> ... </protocol>

 9

                        </frm:organization>

10

            </softlan>

11

            <hardlan xmlns:hrd="http://www.network.com/hard"

12

                                                 xmlns="http://www.network.com/hard/firm">

13

                        <hrd:equipment type="switch">

14

                                   <protocol net:lan="Ethernet">CSMA/CD</protocol>

15

                        </hrd:equipment>

16

            </hardlan>

17

</net:network>

18

Строки 2 и 3 представляют корневой элемент документа network. В нем определены два пространства имен. Первое идентифицируется префиксом net (в это пространство имен входит и сам элемент net), а второе не имеет префикса, т.е. является пространством имен по умолчанию. Действие обоих пространств имен распространяется на весь документ.

Строки 4 и 11 представляют контейнер, корневой элемент которого (softlan) принадлежит пространству имен по умолчанию http://www.network.com/server, заданному в корневом элементе документа.

Строка 5 представляет элемент protocol, принадлежащий пространству имен http://www.network.com/lan.

Строка 6 представляет элемент protocol, принадлежащий пространству имен по умолчанию http://www.network.com/server.

Строки 7 и10 представляют контейнер, корневой элемент которого (organization) принадлежит пространству имен http://www.network.com/firm, которое объявлено в этом элементе с префиксом frm.

Строка 8 представляет элемент protocol, принадлежащий пространству имен http://www.network.com/firm.

Строка 9 представляет элемент protocol, принадлежащий пространству имен по умолчанию http://www.network.com/server.

Строки 12, 13 и 17 представляют контейнер, корневой элемент которого (hardlan) принадлежит пространству имен по умолчанию http://www.network.com/server. В корневом элементе этого контейнера объявлено два пространства имен. Одно с префиксом hrd, а другое как пространство имен по умолчанию. Поэтому в области действия данного контейнера все элементы и атрибуты без префикса будут принадлежать пространству имен http://www.network.com/hard/firm.

Строки 14 и 16 представляют контейнер, корневой элемента которого (equipment) принадлежит пространству имен http://www.network.com/hard. Атрибут type корневого элемента принадлежит пространству имен по умолчанию xmlns="http://www.network.com/hard/firm.

Строка 15 представляет элемент protocol, принадлежащий пространству имен по умолчанию xmlns="http://www.network.com/hard/firm. Его атрибут lan принадлежит пространству имен http://www.network.com/lan.

5. Пример реализации концепции пространства имен

В первом разделе данной лекции, в качестве примера, мы использовали фразу: "Запер замок на замок, чтобы замок не замок", в которой используются три слова "замок" в качестве а) здания, б) устройства безопасности, в) результата действия.

Для каждого из них сформируем отдельную схему в собственном пространстве имен. Остальные элементы определим в схеме main, которая также представлена в собственном пространстве имен.

В XML документе подключим схемы и объявляем 4 пространства имен. Теперь в XML документе однозначно можно определить смысл каждого слова "замок".

5.1 Пространство имен action для слова "замок" в смысле действия

<?xml version="1.0" encoding="Windiws-1251"?>

<xsd:schema targetNamespace="http://www.action.ru"

elementFormDefault="qualified" attributeFormDefault="unqualified"

xmlns:act="http://www.action.ru"

xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="действие" type="act:actionType"/>

 <!-- В данном типе задаем несколько возможных действий, в том числе и нужное нам -->

 <xsd:complexType name="actionType">

 <xsd:choice>

  <xsd:element name="высох" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>

  <xsd:element name="замок" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>

  </xsd:choice>

 </xsd:complexType>

</xsd:schema>

5.2 Пространство имен building для слова " замок " в смысле здание

<?xml version="1.0" encoding="Windiws-1251"?>

<xsd:schema targetNamespace="http://www.building.ru"

elementFormDefault="qualified" attributeFormDefault="unqualified"

xmlns:bui="http://www.building.ru"

xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="здание" type="bui:buildingType"/>

<!-- В данном типе задаем несколько возможных типов зданий, в том числе и нужное нам -->

 <xsd:complexType name="buildingType">

 <xsd:choice>

  <xsd:element name="дом" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>

  <xsd:element name="замок" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>

  </xsd:choice>

 </xsd:complexType>

</xsd:schema>

5.3 Пространство имен security для слова " замок " в смысле безопасность

<?xml version="1.0" encoding="Windiws-1251"?>

<xsd:schema targetNamespace="http://www.security.ru"

elementFormDefault="qualified" attributeFormDefault="unqualified"

xmlns:sec="http://www.security.ru"

xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="защита" type="sec:securityType"/>

<!-- В данном типе задаем несколько возможных значений в смысле безопасности, в том числе и нужное нам -->

 <xsd:complexType name="securityType">

 <xsd:choice>

  <xsd:element name="запор" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>

  <xsd:element name="замок" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>

  </xsd:choice>

 </xsd:complexType>

</xsd:schema>

5.4 Главное (main) пространство имен

<?xml version="1.0" encoding="Windiws-1251"?>

<xsd:schema targetNamespace="http://www.main.ru"

elementFormDefault="qualified" attributeFormDefault="unqualified"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns="http://www.main.ru"

xmlns:act="http://www.action.ru"

xmlns:bui="http://www.building.ru"

xmlns:sec="http://www.security.ru">

<xsd:import namespace="http://www.action.ru" schemaLocation="e:\phrase\action.xsd"/>

<xsd:import namespace="http://www.security.ru" schemaLocation="e:\phrase\security.xsd"/>

<xsd:import namespace="http://www.building.ru" schemaLocation="e:\phrase\building.xsd"/>

<xsd:element name="документ" type="documentType"/>

 <xsd:complexType name="documentType">

 <xsd:sequence>

  <xsd:element name="фраза" type="mixedTypeminOccurs="0" maxOccurs="unbounded"/>

 </xsd:sequence>

 </xsd:complexType>

 <xsd:complexType name="mixedType" mixed="true">

 <xsd:sequence>

   <xsd:element ref="bui:здание"/>

   <xsd:element ref="sec:защита"/>

   <xsd:element ref="bui:здание"/>

   <xsd:element ref="act:действие"/>

</xsd:sequence>

</xsd:complexType>

</xsd:schema>

5.5 XML документ

<?xml version="1.0" encoding="Windows-1251"?>

<документ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

                                                  xmlns="http://www.main.ru"

                                                  xmlns:act="http://www.action.ru"

                                                  xmlns:bui="http://www.building.ru"

                                                  xmlns:sec="http://www.security.ru"

                                                  xsi:schemaLocation="http://www.main.ru e:\phrase\main.xsd">

            <фраза>

                        Запер <bui:здание><bui:замок>замок</bui:замок></bui:здание> на

                        <sec:защита><sec:замок>замок</sec:замок></sec:защита>, чтобы

                        <bui:здание><bui:замок>замок</bui:замок></bui:здание> не

                        <act:действие><act:замок>замок</act:замок></act:действие>.

            </фраза>

</документ>

Сайт создан в системе uCoz