关于XML Schema命名空间中已经有xmlns却还要targetnamespace的理解

本文解析了XMLSchema中命名空间的使用,特别是xmlns、targetnamespace的区别。通过具体例子介绍了如何利用这些命名空间来提高XML文档的可读性和管理性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

            最近在学习XML Schema,没法很好的分清命名空间的xmlns、targetnamespace的区别,为什么在已经有全局命名空间xmlns和定义的命名空间xmlns:prefix后还要加入一个targetnamespace。上StackoverFlow找到一些解释,现在拿出来分享一下。

            为什么要用targetnamespace?

            通常一个很小的xml文档不需要复杂的命名空间来限定作用域。但是当文档复杂性越来越大,全的命名空间规则很复杂,如果要通过XML Schema来创建和修改XML的内容限定的话,很多人会习惯性的在一个文件中储存所有的Schema。但是实际上一个良好的符合标准的规范应当是将文档分成很多个子Schema,这个过程可以叫做XML Schema Binding。命名空间就是一个分割Schema的机制,子schema被包含在一个父schema中,这样就提高了复用性,使得一个schema包可以用在很多的工程中。而且这样能够提高定义的可读性,也使文档易于管理。

            xmlns:prefix="http:/www.w3c.com" 这种形式是自定义prefix的方式来命名作用空间,属于最小的作用域。

            xmlns="http:/www.w3c.com" 这种形式是定义默认命名空间,文档内所有的未做限定的元素都在这个命名空间下。

targetnamespace就是收罗不同文件的统一的一个域名。

            形象地比喻来说就像一个Java工程里,class文件中通常会标明文件归属的包import packagetargetnamespace类比于包的名字。

例:

        常见的XML及其XML Schema样式

XML:

<p:Person
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://localhost:8080/scribble/xml/Person"
        xmlns:v="http://localhost:8080/scribble/xml/Vehicle"
        xsi:schemaLocation="
            http://localhost:8080/scribble/xml/Person
            http://localhost:8080/scribble/xml/person.xsd">
    <name>John</name>
    <age>28</age>
    <height>59</height>
    <v:Vehicle>
        <color>Red</color>
        <wheels>4</wheels>
        <seats>2</seats>
    </v:Vehicle>
</p:Person>


该XML没有默认命名空间,但是有xmlns:p和xmlns:v标识URI


Schema:

Person:

<?xml version="1.0" encoding="UTF-8"?>
<schema
    xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://localhost:8080/scribble/xml/Person"
    elementFormDefault="qualified"
    xmlns:v="http://localhost:8080/scribble/xml/Vehicle">

    <import
        namespace="http://localhost:8080/scribble/xml/Vehicle"
        schemaLocation="http://localhost:8080/scribble/xml/v.xsd"/>

    <element name="Person">
        <complexType>
            <sequence>
                <element name="name" form="unqualified" type="NCName"/>
                <element name="age" form="unqualified" type="integer"/>
                <element name="height" form="unqualified" type="integer"/>
                <element ref="v:Vehicle"/>
            </sequence>
        </complexType>
    </element>

</schema>


Vehicle:

<?xml version="1.0" encoding="UTF-8"?>
<schema
    xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://localhost:8080/scribble/xml/Vehicle"
    elementFormDefault="qualified">

    <element name="Vehicle">
        <complexType>
            <sequence>
                <element name="color" form="unqualified" type="NCName"/>
                <element name="wheels" form="unqualified" type="integer"/>
                <element name="seats" form="unqualified" type="integer"/>
            </sequence>
        </complexType>
    </element>
</schema>



XML文件受Person限制,Person文件含有Vehicle限制。两个Schema文件的默认命名空间都是:
http://www.w3.org/2001/XMLSchema
            而targetNamespace被用作了实例XML的别名p和v。这里targetNamespace作为实例文件的命名空间,与xml实例文件中的schema文件等声明的命名空间关系不大。targetNamespace就好像一个会议的名单,文件中的命名空间就像是一个人的姓名牌,只要姓名牌和名单对上了就能用。在这里v的命名空间级别最高,p的就要服从于v。
有了这样的命名空间的规则,这样schema的复用性就能很好地体现。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值