来源:https://blog.csdn.net/wanghuan203/article/details/9204337

XML和Schema具有无关平台,技术厂商,简单,规范统一等特点,极具开放性,所以使用极为广泛,而且使用简单,在XML和Schema和,个人认为比较不好理解的一点是其命名空间问题,在这篇博客里详细进行理解。

名称空间是W3C推荐标准提供的一种统一命名XML文档中的元素和属性的机制。使用名称空间可以明确标识和组合XML文档中来自不同标记词汇表的元素和属性,避免了名称之间的冲突。

使用过DTD的人应该知道,命名冲突是DTD的一大问题,而Schema里引入了命名空间的概念,就很好的解决了这个问题。具体来看:

1、声明名称空间

名称空间声明的一般形式为:第一部分是一个关键字xmlns:,第二部分是名称空间的前缀,第三部分是一个等号,第四部分是双引号,将第五部分的名称空间标识URI包括起来。需要注意的是,名称空间的前缀不能为xml,因为在XML中这个字符串是保留作特殊用途的。例:
     xmlns:tns="http://www.whtest.com/"    //其中tns为前缀。
     还可以隐式声明名称空间,即省略掉冒号和名称空间前缀。例:
     xmlns="http://www.whtest.com/"   //注意在一个文档中只能有一个隐式声明的命名空间

2、Schema中的命名空间:

(1)Schema中的全局成分

全局成分指的是元素xsd:schema的直接子节点,包括元素声明、属性声明、复杂/简单类型定义、组定义、属性组定义。

  1.  
    <?xml version=”1.0”>
  2.  
    <xsd:schema xmlns:xsd=”http://www.w3.org/XML_Schema”
  3.  
    targetNamespace=“http://www.test.com/ns/ns_test“>
  4.  
    // Schema的目标名称空间用属性targetNamespace在根元素上定义。
  5.  
    //Schema的全局成分被放在名称空间http://www.test.com/ns/ns_test里。
  6.  
     

(2)Schema中的非全局成分

有时希望将非全局成分定义在目标空间中去,可使用下面方法。

  1.  
    <?xml version=”1.0”>
  2.  
    <xsd:schema xmlns:xsd=”http://www.w3.org/XML_Schema”
  3.  
    targetNamespace=“http://www.test.com/ns/ns_test“
  4.  
    elementFormDefault=“qualified“>

属性elementFormDefault的默认值是unqualified,也就是规定了只有全局成分才被定义在目标名称空间中。将elementFormDefault的值赋为qualified,使得目标名称空间包含非全局的元素定义。同样,使属性attributeFormDefault的值赋为qualified,可使得目标名称空间包含非全局属性定义。如下:

  1.  
    <?xml version=”1.0”>
  2.  
    <xsd:schema xmlns:xsd=”http://www.w3.org/XML_Schema”
  3.  
    targetNamespace=“http://www.test.com/ns/ns_test“
  4.  
    attributeFormDefault=“qualified“>

也可以修改属性form的值,使得某些非全局成分不包含在名称空间中。如下:
<xsd:element name=”name” type=”xsd:string” form=”unqualified”/>

(3)targetNamespace

xsd文件中定义了一个targetNameSpace后,其内部定义的元素,属性,类型等都属于该targetNameSpace,其自身或外部xsd文件使用这些元素,属性等都必须从定义的targetNameSpace中找。

targetNamespace定义了Schema定义的新元素与属性的名称空间。而"http://www.w3.org/2001/XMLSchema"名称空间则定义了element, attribute, complexType, group, simpleType等元素。

若自身并不使用重用组件,仅供外部使用的话,则只定义targetNameSpace就可以,不用指定别名。

3、XML文档中命名空间

在XML中,名称空间的使用涉及范畴的概念,范畴即名称空间的覆盖范围,它指的是哪些元素和属性在该名称空间中,哪些不在该名称空间中。名称空间既可以限定整个XML文档,也可以只针对XML文档中的一部分。

(1).名称空间限定整个XML文档

  1.  
    <?xml version=”1.0”?>
  2.  
    <member_details xmlns=”http://www.testns.com/ns.xsd”>
  3.  
    <name>Tom</name>
  4.  
    <age>12</age>
  5.  
    <sex>male</sex>
  6.  
    </member_details>

(2)名称空间只针对XML文档中的一部分

  1.  
    <?xml version=”1.0”?>
  2.  
    <member_details>
  3.  
    <name xmlns=”http://www.testns.com/ns.xsd”>Tom</name>
  4.  
    <age>12</age>
  5.  
    <sex>male</sex>
  6.  
    </member_details>

(3)嵌套的命名空间

  1.  
    <?xml version=”1.0”?>
  2.  
    <member_details xmlns=”http://www.testns.com/ns.xsd”
  3.  
    xmlns:newns=”http://www.testns/newns.xsd”>
  4.  
    <name>Tom</name>
  5.  
    <age>12</age>
  6.  
    <newns:sex>male</sex>
  7.  
    </member_details>
  8.  
    // 此例中,除了元素sex被定义在新的名称空间中外,其余的元素仍然使用原来的名称空间。

(4)schemaLocation

schemaLocation 属性引用具有目标名称空间的 XML 架构文档(.xsd)。该xml文件中用到的所有新创的元素、属性等的.xsd文件都必须在这里声明。
<xsi:schemaLocation="list of anyURI" >

其中的anyURI是一个架构位置,该架构包含限定的(具有名称空间的架构)架构构造。每一对中的第一个 URI 引用是名称空间名称,第二个则是描述名称空间的架构的位置。

将具有目标名称空间的架构文档与实例文档相关联。可以列出多对 URI 引用,每一对都有不同的名称空间名称部分。
    根据万维网联合会 (W3C) XML 架构建议,XML 实例文档可以同时指定 xsi:schemaLocation 和 xsi:noNamespaceSchemaLocation 属性。此外,还可以多次列出同一个命名空间。

以下示例显示如何使用 xsi:schemaLocation 属性为多个 XML 架构文档提供位置信息。

  1.  
    <p:Person
  2.  
    xmlns:p="http://contoso.com/People"
  3.  
    xmlns:v="http://contoso.com /Vehicles"
  4.  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.  
    xsi:schemaLocation=
  6.  
    "http://contoso.com/People
  7.  
    http://contoso.com/schemas/people.xsd
  8.  
    http://contoso.com/schemas/Vehicles
  9.  
    http://contoso.com/schemas/vehicles.xsd
  10.  
    http://contoso.com/schemas/People
  11.  
    http://contoso.com/schemas/people.xsd">
  12.  
    <name>John</name>
  13.  
    <age>28</age>
  14.  
    <height>59</height>
  15.  
    ....
  16.  
    </p:Person>

(5)noNamespaceSchemaLocation

noNamespaceSchemaLocation 属性引用没有目标名称空间的 XML 架构文档。
    <xsi:noNamespaceSchemaLocation="anyURI" >

与SchemaLocation相同anyURI是一个架构位置,该架构包含非限定的(没有名称空间的架构)架构构造。

不要求 XML 架构有名称空间。若要为没有目标名称空间的 XML 架构指定位置,请使用 noNamespaceSchemaLocation 属性。此属性中引用的 XML 架构不能有目标名称空间。因为此属性不接受 URL 列表,所以只能指定一个架构位置。
    根据万维网联合会 (W3C) XML 架构建议,XML 实例文档可以同时指定 xsi:schemaLocation 和   xsi:noNamespaceSchemaLocation 属性。

以下示例显示如何对包含非限定元素的实例文档使用 xsi:noNamespaceSchemaLocation 属性。

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <book:books xmlns:book="http://www.example.org/02"
  3.  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.  
    xsi:noNamespaceSchemaLocation="02.xsd">
  5.  
    <book:book id="1">
  6.  
    <book:title>Java in action</book:title>
  7.  
    <book:content>Java is good</book:content>
  8.  
    <book:author>Bruce</book:author>
  9.  
    </book:book>
  10.  
    </book:books>

通过上边的分析,我们可以看到,XML和Schema的命名空间标签使用格式是相同的(这也是Schema相对与DTD的优势),但XML和Schema都有各自的独特的属性,这也是由他们不同的功能决定的,Schema主要给XML提供服务,所以会规定好targetNameSpace来声明命名空间的名字,而XML需要使用schema的服务,所以需要SchemaLocation来声明使用的命名空间。

例一:重点理解名称空间的相关概念。

下面的例子是一个XML Schema文件,名为"note.xsd"

  1.  
    <?xml version="1.0"?>
  2.  
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  3.  
    targetNamespace="http://www.w3schools.com"
  4.  
    xmlns="http://www.w3schools.com"
  5.  
    elementFormDefault="qualified">
  6.  
    <xsd:element name="note">
  7.  
    <xsd:complexType>
  8.  
    <xsd:sequence>
  9.  
    <xsd:element name="to" type="xs:string"/>
  10.  
    <xsd:element name="from" type="xs:string"/>
  11.  
    <xsd:element name="heading" type="xs:string"/>
  12.  
    <xsd:element name="body" type="xs:string"/>
  13.  
    </xsd:sequence>
  14.  
    </xsd:complexType>
  15.  
    </xsd:element>
  16.  
    </xsd:schema>

下面的XML文档和上文给出的XML Schema相关联,名为"note.xml"。并且下文的讨论将围绕这两个文档展开。

  1.  
    <?xml version="1.0"?>
  2.  
    <note xmlns="http://www.w3schools.com"
  3.  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.  
    xsi:schemaLocation="http://www.w3schools.com note.xsd">
  5.  
    <to>Tove</to>
  6.  
    <from>Jani</from>
  7.  
    <heading>Reminder</heading>
  8.  
    <body>Don't forget me this weekend!</body>
  9.  
    </note>
            此片段:xmlns:xsd="http://www.w3.org/2001/XMLSchema",表明此schema中使用的元素和数据类型来自于"http://www.w3.org/2001/XMLSchema"名称空间(namespace)。它同样指出来自于"http://www.w3.org/2001/XMLSchema"名称空间的元素和数据类型必须使用带"xsd: "前缀。作为名称空间的标识符(在声明中作为元素或属性的前缀),你也可以不使用xsd或xsi。这个 xmlns属性包含了基本的XML schema元素,比如element, attribute, complexType, group, simpleType等。
     对于任何一个XML Schema定义文档(XSD)都有一个最顶层的schema (XSD)元素。而且该schema (XSD)元素定义必须包含这个名称空间:http://www.w3.org/2001/XMLSchema。即此名称空间是由XML模式规范定义的标准名称空间-所有XML模式元素必须属于该名称空间。
     此片段:targetNamespace="http://www.w3schools.com",表明此schema (note, to, from, heading, body)定义的元素来自于"http://www.w3schools.com"名称空间。这个targetNamespace属性表示了该schema所对应的名称空间的URI。也就是说在引用该Schema的其它文档(包括自身文档)中要声明名称空间,其URI应该是targetNamespace的属性值。例如在这里因为要用到note.xsd自己定义的扩展数据类型(note, to, from, heading, body),所以也声明了名称空间xmlns="http://www.w3schools.com"。而且该名称空间是默认名称空间(没有前缀)。targetNamespace属性为在模式中显式创建的所有新类型均声明了XML名称空间。

我们再来看由该schema规定的XML文档note.xml的开头将是什么样子:

  1.  
    <note xmlns="http://www.w3schools.com"
  2.  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.  
    xsi:schemaLocation="http://www.w3schools.com note.xsd">

其中缺省名称空间声明xmlns="http://www.w3schools.com"就是和刚刚声明的XML Schema的名称空间相结合来规定该XML文档。(即该文档用到了此名称空间中定义的数据) xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 是任何XML实例文档固有的XML模式实例名称空间,它由XML模式规范定义。而xsi:schemaLocation="http://www.w3schools.com note.xsd"则规定了该名称空间所对应的schema的位置,即在相同路径的note.xsd文件。

例二:重点理解Schema文档使用自身定义类型

xsd文件中定义了一个targetNameSpace后,其内部定义的元素,属性,类型等都属于该targetNameSpace,其自身或外部xsd文件使用这些元素,属性等都必须从定义的targetNameSpace中找。修改一下note.xsd,去除默认名称空间的声明,并添加一个复杂类型:

  1.  
    <?xml version="1.0"?>
  2.  
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  3.  
    targetNamespace="http://www.w3schools.com"
  4.  
    elementFormDefault="qualified">
  5.  
    <xsd:element name="note">
  6.  
    <xsd:complexType>
  7.  
    <xsd:sequence>
  8.  
    <xsd:element name="to" type="xs:string"/>
  9.  
    <xsd:element name="from" type="xs:string"/>
  10.  
    <xsd:element name="heading" type="xs:string"/>
  11.  
    <xsd:element name="body" type="xs:string"/>
  12.  
    </xsd:sequence>
  13.  
    </xsd:complexType>
  14.  
    </xsd:element>
  15.  
    <xsd:element name="Student" type="stu"/>
  16.  
    <xsd:complexType name="stu">
  17.  
    <xsd:sequence>
  18.  
    <xsd:element name="Name" type="xs:string"/>
  19.  
    <xsd:element name="Class" type="xs:string"/>
  20.  
    </xsd:sequence>
  21.  
    </xsd:complexType>
  22.  
    </xsd:schema>

上述代码中,复杂类型stu是找不到的,因为你定义了一个名称空间"http://www.w3schools.com",该复杂类型存在于"http://www.w3schools.com"中,因此应该修改代码如下:

  1.  
    <?xml version="1.0"?>
  2.  
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  3.  
    targetNamespace="http://www.w3schools.com"
  4.  
    xmlns:student="http://www.w3schools.com"
  5.  
    elementFormDefault="qualified">
  6.  
    <xsd:element name="note">
  7.  
    <xsd:complexType>
  8.  
    <xsd:sequence>
  9.  
    <xsd:element name="to" type="xs:string"/>
  10.  
    <xsd:element name="from" type="xs:string"/>
  11.  
    <xsd:element name="heading" type="xs:string"/>
  12.  
    <xsd:element name="body" type="xs:string"/>
  13.  
    </xsd:sequence>
  14.  
    </xsd:complexType>
  15.  
    </xsd:element>
  16.  
    <xsd:element name="Student" type="student:stu"/>
  17.  
    <xsd:complexType name="stu">
  18.  
    <xsd:sequence>
  19.  
    <xsd:element name="Name" type="xs:string"/>
  20.  
    <xsd:element name="Class" type="xs:string"/>
  21.  
    </xsd:sequence>
  22.  
    </xsd:complexType>
  23.  
    </xsd:schema>

若自身并不使用重用组件,仅供外部使用的话,则只定义targetNameSpace就可以,不用指定别名。
        通过上面的例子,我们可以很深刻的理解targetNameSpace。targetNamespace定义了Schema定义的新元素与属性的名称空间。而"http://www.w3.org/2001/XMLSchema"名称空间则定义了element, attribute, complexType, group, simpleType等元素。

XML和Schema命名空间详解的更多相关文章

  1. XML参考 :XmlReader 详解、实例

    XML参考 :XmlReader 详解.实例-- 详解 转:http://www.cnblogs.com/Dlonghow/archive/2008/07/28/1252191.html XML参考 ...

  2. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  3. XML解析之SAX详解

    XML解析之SAX详解 本文属于作者原创 http://www.cnblogs.com/ldnh/ XML解析的五个步骤 1.打开文档 (void)parserDidStartDocument:(NS ...

  4. Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  5. linux命名空间详解_转

    转自: Linux的命名空间详解--Linux进程的管理与调度(二) Linux Namespaces机制提供一种资源隔离方案. PID,IPC,Network等系统资源不再是全局性的,而是属于特定的 ...

  6. Spring框架入门之基于xml文件配置bean详解

    关于Spring中基于xml文件配置bean的详细总结(spring 4.1.0) 一.Spring中的依赖注入方式介绍 依赖注入有三种方式 属性注入 构造方法注入 工厂方法注入(很少使用,不推荐,本 ...

  7. PULL解析XML的运行机制详解

    PULL解析简单易上手,基本上看一遍,基本上就会解析啦,但总是感觉对PULL解析的运行机制不是很了解,就总结了以下事件驱动到底是怎么执行的.. PULL: Android内置了PULL解析器.PULL ...

  8. java操作xml方式比较与详解(DOM、SAX、JDOM、DOM4J)

    java中四种操作(DOM.SAX.JDOM.DOM4J)xml方式的比较与详解     1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准. ...

  9. oracle schema 白话文详解

    概述: (一)什么Oracle叫用户(user): A user is a name defined in the database that can connect to and access ob ...

随机推荐

  1. Dispatch Groups

    Dispatch Groups are objects that allow several tasks to be grouped for later joining. Tasks can be a ...

  2. Volatile variables

    Volatile variables apply another type of memory constraint to individual variables. The compiler oft ...

  3. express + jqPaginator 分页展示内容

    写在前面的话 分页展示内容也是我们在页面开发中经常会遇到的需求 前端页面利用jqPaginator这个jquery插件来编写 后端利用mysql存储数据 开始敲代码 回顾sql知识 首先让我们回顾一下 ...

  4. canvas图片滚动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  5. 集合(set)的基本操作

    集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 集合中的元素必须是不可变类型 关系测试,测试两组数据之前的交集.差集.并集等关系 常用操作 a = se ...

  6. caioj 1155 同余方程组(模版)

    第一步,和同余方程一样,转化一下 两式相减得 这就转化为了求不定方程,用exgcd 求出x,要化成最小正整数解,避免溢出 然后可以求出P出来. 这个时候要把前两个式子转化成一个式子 设求出来的是P' ...

  7. Object-C,NSURL,统一资源定位器

    今天晚上最后一个例子,写完休息娱乐一会. URL,统一资源定位器,可以定位网络上的一个资源. 没啥难的,还是对象.方法.API.和Java等语言没有啥区别. 不亲自一点点写一遍,印象不深,今后进一步深 ...

  8. MD5 加密原理(转)

    MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Secur ...

  9. 【Linux编程】socket编程

    套接字是通信端点的抽象.文件描写叙述符用open函数创建,而套接字描写叙述符用socket函数创建.socket函数原型例如以下: int socket(int domain, int type, i ...

  10. JNI中java类型的简写

      在JNI中,当我们使用GetFieldID/GetStaticFieldID或GetMethodID/GetStaticMethodID及定义JNINativeMethod等时,我们需要表示成员变 ...