XML - Namespace

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>
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值