Пространства имен XML

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

Пространства имен XML определены рекомендацией W3C от 16 августа 2006 года: Пространства имен в XML. Имена тегов XML должны быть глобально уникальными, а также краткими в целях повышения производительности. Для того чтобы разрешить это противоречие рекомендация о пространствах имен W3C определяет атрибут xmlns, который может внести изменение в любой элемент XML. Если он присутствует в элементе, он определяет для него пространство имен.

Атрибут xmlns имеет следующий синтаксис:

xmlns:prefix=namespace

где namespace - это уникальный URI (например, www.ibm.com), а prefix представляет пространство имен и предоставляет указатель на него.

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

<acct:customer xmlns:acct="http://www.my.com/acct-REV10">
	<acct:name>Corporation</acct:name>
	<acct:order acct:ref="5566"/>
	<acct:status>invoice</acct:status>
</acct:customer>  

Определение пространства имен в первой строке присваивает префиксу пространство http://www.my.com/acct-REV10. Этот префикс используется в именах элементов, таких как название в заказе, для того чтобы присоединить их к пространству имен. В следующем примере приведена система исполнения заказов, которая может присваивать различные пространства имен своим элементам заказчика:

<ful:customer xmlns:ful="http://www.your.com/ful">
	<ful:name>Corporation</ful:name>
	<ful:order ful:ref="A98756"/>
	<ful:status>shipped</ful:status>
 </ful:customer>

Приложение теперь может обрабатывать отдельно обе структуры данных - учета и исполнения. Это пространство имен по умолчанию. Оно устанавливается, если локальное имя не присвоено в определении пространства имен.

<acct:customer
xmlns="http://www.my.com/acct-REV10" xmlns:acct="http://www.my.com/acct-REV10
">
<name>Corporation</name>
<order acct:ref="5566"/>
<status>invoice</status>
</customer>

В этом примере все теги в записи заказчика уточнены пространством имен http://www.my.com/acct-REV10. Явный префикс не требуется, потому что используется пространство имен по умолчанию. Заметьте, что пространство имен по умолчанию применяется к любым определениям атрибутов.

Схемы XML и пространства имен

В следующей схеме XML пространство имен по умолчанию определено как стандартное пространство схемы XML http://www.w3.org/2001/XMLSchema. Существует также специфическое пространство имен http://www.ibm.com.

<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns:TestSchema="http://www.ibm.com">
 <simpleType name="ZipCodeType">
 <restriction base="integer">
  <minInclusive value="10000"/>
 <maxInclusive value="99999"/>
</restriction>
 </simpleType> 
 <!--определения элементов пропущены -->  
</schema>  

Предположим, что предыдущая схема XML сохранена как C:\temp\TestSchema.xsd, тогда файлом примера XML, который проверяет эту схему, является:

<?xml version="1.0"?>
<x:addressList xmlns:x="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://www.ibm.com file:///C:/temp/TestSchema.xsd">
 xsi:schemaLocation="http://www.ibm.com file:///C:/temp/TestSchema.xsd">
<x:address>
 <x:street>x:Vangerowstrasse</x:street>
  <x:zipCode>69115</x:zipCode>
 <x:city>x:Heidelberg</x:city>
 </x:address>
    <x:address> 
<x:street>x:Bernal Road</x:street> 
<x:zipCode>90375</x:zipCode>
     <x:city>x:San Jose</x:city>
 </x:address>
</x:addressList> 

Целевое пространство имен

Целевое пространство имен служит для определения пространства имен, в котором существует связь между элементом и его именем. В объявлениях эта связь определяет пространство имен элементов в файлах XML, удовлетворяющих схеме. Файл XML, который импортирует схему, должен ссылаться на свое целевое пространство имен в атрибуте schemaLocation. О всех несоответствиях между целевым и фактическим пространством имен элемента сообщается в виде ошибок при проверке схемы. В нашем примере целевое пространство имен - это http://www.ibm.com, оно определено в файле схемы XML и дважды указано в файле XML. Все несоответствия между этими тремя вхождениями пространства имен приводят к ошибкам проверки.

В следующих примерах показано, как целевые пространства имен и их префиксы применяются в схемах XML и соответствующих им документах экземпляра XML.

Пример 1 - Схема с пространством имен по умолчанию, целевым пространством имен и неуточненными локальными элементами

Схема XML:

<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns:x="http://www.ibm.com">
<complexType name="AddressType">
<sequence>
<element name="name" type="string"></element>
</sequence>
</complexType>
<element name="MyAddress" type="x:AddressType"></element>
</schema> 

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

<?xml version="1.0"?>
<x:MyAddress xmlns:x="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com x.xsd ">
<name>Peter Smith</name>
</x:MyAddress> 

Когда локальные элементы (такие как элемент "name") и атрибуты не уточнены в файле XML, тогда уточнен только корневой элемент. Таким образом, в этом примере префикс пространства имен "x" присвоен корневому элементу "MyAddress", связывая его с пространством имен "http://www.ibm.com", но префикс "x" не присвоен локальному элементу "name".

Пример 2 - Схема с пространством имен по умолчанию, целевым пространством имен и уточненными локальными элементами

<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns:x="http://www.ibm.com" elementFormDefault="qualified">
<complexType name="AddressType">
<sequence>
<element name="name" type="string"></element>
</sequence>
</complexType>
<element name="MyAddress" type="x:AddressType"></element>
 </schema>  

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

<?xml version="1.0"?>
  <x:MyAddress xmlns:x="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.ibm.com x.xsd "> 
<x:name>Peter Smith</x:name>
 </x:MyAddress>

В этом примере префикс пространства имен "x" присвоен как корневому элементу "MyAddress", так и локальному элементу "name", связывая их с пространством имен "http://www.ibm.com".

Пример 3 - Схема с целевым пространством имен и явным определением xmlns:xsd

Эта схема XML добавляет этот атрибут:

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

Это означает, что каждая из конструкций языка схемы XML требует уточнения с помощью префикса "xsd". Например, xsd:complexType и xsd:string

. Заметьте, что для объявления и использования можно выбрать любые другие префиксы, например, "xs" или "foobar".

Можно указать этот префикс на странице параметров схемы XML. Более подробная информация содержится по связанным ссылкам.

Все определенные пользователем типы принадлежат к пространству имен http://www.ibm.com, как определено атрибутом targetNamespace, и имеют префикс "x", как определено атрибутом xmlns:x.

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns:x="http://www.ibm.com">
<xsd:complexType name="AddressType">
<xsd:sequence>
		 <xsd:element name="name" type="xsd:string"></xsd:element>
</xsd:sequence>
 </xsd:complexType>
 <xsd:element name="MyAddress" type="x:AddressType"></xsd:element>
</xsd:schema>

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

<?xml version="1.0"?>
 <x:MyAddress xmlns:x="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.ibm.com x.xsd ">
<name>Peter Smith</name>
 </x:MyAddress>

Пример 4 - Схема с необъявленным целевым пространством имен, в которой явно определен атрибут xmlns:xsd

Эта схема XML сама не имеет целевого пространства имен. В этом случае настоятельно рекомендуется явно уточнять все конструкции схемы XML префиксом, например "xsd". Ссылки на определения и объявления из этой схемы, такие как AddressType, не уточнены пространством имен, так как не существует префикса пространства имен.

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="AddressType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"></xsd:element>
<xsd:element name="name" type="xsd:string"></xsd:element>
<xsd:element name="name" type="xsd:string"></xsd:element> 
</xsd:sequence> 
</xsd:complexType>
<xsd:element name="MyAddress" type="AddressType"></xsd:element> 
</xsd:schema> 

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

<?xml version="1.0"?>
<MyAddress xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="x.xsd">
<name>name</name>
</MyAddress>

Пример 5 - Схема, в которой целевое пространство имен является пространством имен по умолчанию

Это схема XML, в которой целевое пространство имен является пространством имен по умолчанию. Также, пространство имен не имеет префикса.

<?xml version="1.0"?>
 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns="http://www.ibm.com">
<xsd:complexType name="AddressType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
 <xsd:element name="MyAddress" type="AddressType"></xsd:element>
 </xsd:schema> 

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

<?xml version="1.0" encoding="UTF-8"?>
<MyAddress xmlns="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com NewXMLSchema.xsd">
<name>name</name>
 </MyAddress>  
Задачи, связанные с данной
Изменение параметров файлов схем XML