XML 名称空间是一组用 URI 引用标识的名称,这些名称在 XML 文档中用作元素类型和属性名称。
xmlns 属性的语法如下:
xmlns:prefix=namespace
其中 namespace 是唯一的 URI(例如,www.ibm.com),而 prefix 表示名称空间并提供指向它的指针。
在以下 customer 元素定义中,定义了帐户名称空间以便能够区分元素标记与出现在由其它商业应用程序创建的客户记录中的元素标记。
<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 指定给前缀。将此前缀用于元素名称(例如,name)上以便将它们与名称空间相连接。第二个应用程序(例如,实现系统)可以为它的客户元素指定不同的名称空间:
<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> <!--element definitions skipped --> </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 模式本身没有目标名称空间。在此情况下,强烈建议使用前缀(例如,“xsd”)来显式限定所有 XML 模式构造。引用了此模式的定义和声明(例如,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>