Пространство имен XML - это набор имен, определяемых по ссылке URI, которые используются в документах 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 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.
Схема 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".
<?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".
Эта схема 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>
Эта схема 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>
Это схема 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>