Schema定义了一种XML标记语言,用于描述某一特定XML文档;
正如类是Java对象的类型一样,XML标记语言是经XML Schema定义的XML文档的类型。
某些情况下,我们可以将两个或将多个XML标记语言结合到一个文档中,
这样一来,不同标记语言的元素就可以使用不同的XML Schema分别加以验证。
可以将AddressType定义于自己的Schema中,便于其他场合引用,单独作为一个标记语言:
<?xml version="1.0" encoding="UTF-8"> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.titan.com/Address"> <complexType name="AddressType"> <sequence> <element name="street" type="string" /> <element name="city" type="string" /> <element name="state" type="string" /> <element name="zip" type="string" /> </sequence> </conplexType> </schema>
为了能够在同一份XML文档中使用不同的标记语言,必须明确表示每个元素的标记语言。
XML Namespace声明使用如下格式: xmlns:prefix = "URI"
<?xml version="1.0" encoding="UTF-8"> <res:reservation xmlns:res="http://www.titan.com/Reservation"> <res:customer> ... <addr:address xmlns="http://www.titan.com/Address"> <addr:street>3224 West 1st Ave.</addr:street> ... </addr:address> ... </res:customer> <res:cruise-id>123</res:cruise-id> ... </res:reservation>
所有的地址信息都被冠以addr:前缀;
而所有预定相关的元素则被冠以res:前缀。
有了这些前缀,解释器就可以很容易识别和区分出:
- 那些元素属于Address标记,与地址相关的用Address XSD加以验证
- 那些元素属于Reservation标记,与预定相关的元素可以通过Reservation XSD加以验证
前缀可以是任何内容
但是URI(Universal Resource Identifier)必须专门定义;
URI作为一种标示符,是URL(Universal Resource Locator)的一个超集。
声明XML Namespaces所用的URI代表我们使用的标记语言。
它不必指向某个Web页面或XML文档,只需做到所用的标记语言是唯一即可。
例如:
Address标记所用的XML Namespace和Reservation标记所用的URI是不同的。
在XML Namespace中的声明的URI应该与XML Schema中声明的目标名字空间(target namespace)保持一致;
targetNamespace属性指明了对应于该标记语言的唯一URI。
它是该XML Schema的永久标识,任何时候只要有其他文档应用了Address XSD中的元素;
该文档就必须声明相应的XML Namespace,以标识出属于Address标记语言的那些元素。
在每个XML文档的每个元素前面都加上标识,显得有些繁琐;
因此XML Namespace允许我们为所有不带前缀的元素声明默认的名字空间。
默认名字空间就是一个简单的没有前缀(xmlns=“URI”)的XML Namespace声明。
<reservation xmlns="http://www.titan.com/Reservation"> ... <customer> ... <addr:address xmlns="http://www.titan.com/Address"> <addr:street>3224 West 1st Ave.</addr:street> ... </addr:address> ... </customer> </cruise-id>123</cruise-id> ... </reservation>
所有预定元素的名称都没有添加前缀。
任何不带前缀的元素都属于默认名字空间。
因为地址元素不属于http://www.titan.com/Reservation名字空间,所以他们都加上了前缀,用以指示所属名字空间。
默认名字空间的声明是有作用域的;
换而言之,它会作用于声明该名字空间的元素(如果元素没有前缀),已经内嵌该元素之下的任何不带前缀的子元素。
地址空间可以使用自己的默认名字空间覆盖当前的默认名字空间,
通过御用名字空间作用规则,我们可以进一步简化Reservation文档:
<reservation xmlns="http://www.titan.com/Reservation"> ... <customer> ... <address xmlns="http://www.titan.com/Address"> <street>3224 West 1st Ave.</street> ... </address> ... </customer> </cruise-id>123</cruise-id> ... </reservation>
XML文档中所使用的任何属性都应该加上名字空间标识符作为修饰;
这一规则唯一例外是由XML语言自身定义的属性,例如:
用于建立XML Namespace声明的xmlns属性。该属性无须使用前缀进行修饰,因为它是XML语言的固有部分。
XML Namespace是一种唯一标识名字空间的URI;
它并不指向某个实际资源。换而言之,通过不会利用XML Namespace的URI来查找资源。
它只是一个标示符而已。
可能你希望为关联于某个XML Namespace的XML Schema指向所在的位置:
<?xml version="1.0" encoding="UTF-8"> <reservation xmlns:res="http://www.titan.com/Reservation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-Instance" xsi:schemaLocation="http://www.titan.com/Reservation http://www.titan.com/schemas/reservation.xsd"> ... </reservation>
这样解析器可以将其下载下来以供验证只用:
xsi:schemalocation
schemaLocation属性提供了一组Namespace-Location的值对。
值对中前一个值是XML Namespace的URI;后一个值则是XML Schema的物理位置URL。
上述schemaLocation声明了:
所有属于Reservation名字空间(http://www.titan.com/Reservation)的元素可以使用位于
“http://www.titan.com/schemas/reservation.xsd”的XML Schema进行验证。
schemaLocation属性不是XML语言的一部分,所以我们使用时需要在属性前面加上相应的名字空间。
XML Schema规范定义了一个特殊的名字空间,名叫“http://www.w3.org/2001/XMLSchema-Instance”
可以将其用于schemalocation(以及其他属性)。
为了正确声明schemaLocation属性,你必须为其声明XML Namespace,并将该名字空间的标示符作为属性的前缀。
XML Schema也会使用XML Namespace。
所有内建的string类型与int类型的type属性都属于XML Schema名字空间,因此无需添加前缀。
当然如果愿意,也可以添加,使得整个文档更加清晰。
亦即使用xsd:string和xsd:int来代替string和int。
前缀xsd指向XML Schema的名字空间,使得我们能够清楚地标示出定义为XML Schema的内建类型。
<?xml version="1.0" encoding="UTF-8"> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.titan.com/Address"> <complexType name="AddressType"> <sequence> <element name="street" type="xsd:string" /> <element name="city" type="xsd:string" /> <element name="state" type="string" /> <element name="zip" type="string" /> </sequence> </conplexType> </schema>