`
xierh21
  • 浏览: 23857 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

XML学习笔记(一):XML中的命名空间

阅读更多
由于项目需要对大量的XML文件进行处理,而自己当时的XML知识还仅限在怎么编写XML实例文档,使用简单的XPath对XML文档进行搜索,而对于XML模式、XLST没有任何概念。一句话就是XML的相关知识还是相当的匮乏,所以下决心开始学习XML比较深入的知识,而此次的XML学习之旅将从XML模式开始。并将此学习过程中的一些心得总结出来,以供大家分享。文中有不当之处,望前辈指点一二:)
一、XML中命名空间的作用
之前每当自己编写XML实例文档时总是会被命名空间所困扰,不明白它的意义和作用,但是好像对自己编写XML实例文档也没有什么影响,所以也没有深入的去理解它。其实XML里的命名空间的作用与其它语言(如C#)中命名空间的作用差不多:为命名提供一个容器,只要在该容器中没有相同的命名就可以避免命名冲突。在不同的命名空间里的相同的命名会被解析成两个不同的命名,这样就可以像模块化编程一样编写XML文档(关于XML命名空间的具体作用可以参考W3C描述)。下面的示例中定义了两个XML模式和一个XML实例文档

n1schema.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="n1schema"
    targetNamespace="http://tempuri.org/n1schema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/n1schema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>

    <xs:complexType name="Address">
        <xs:sequence>
            <xs:element name="Country" type="xs:string"></xs:element>
            <xs:element name="Province" type="xs:string"></xs:element>
            <xs:element name="City" type="xs:string"></xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
 
n2schema.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="n2schema"
    targetNamespace="http://tempuri.org/n2schema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/n2schema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
    
    <xs:complexType name="Address">
        <xs:sequence>
            <xs:element name="Country" type="xs:string"></xs:element>
            <xs:element name="State" type="xs:string"></xs:element>
            <xs:element name="City" type="xs:string"></xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
 
multiNamespaceTest.xml
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:n1="http://tempuri.org/n1schema.xsd"
      xmlns:n2="http://tempuri.org/n2schema.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <billTo xsi:type="n1:Address">
        <n1:Country>China</n1:Country>
        <n1:Province>Jiangsu</n1:Province>
        <n1:City>Nanjing</n1:City>
    </billTo>
    <shipTo xsi:type="n2:Address">
        <n2:Country>USA</n2:Country>
        <n2:State>IL</n2:State>
        <n2:City>Chicago</n2:City>
    </shipTo>
</root>

在n1shema.xsd和n2schema.xsd中都定义了一个复杂类型Address,然后在multiNamespaceTest.xml实例文档中引入前两个XML模式定义的命名空间,我们可以看到billTo元素定义为n1schema.xsd中定义的Address类型,而shipTo元素定义为n2schema.xsd中定义的Address类型,在multiNamespaceTest.xml中这两个Address类型并不会相互冲突。

二、XML模式创建的命名空间
从上面的n1schema.xsd和n2schema.xsd中可以看出,它们的schema元素都定义了targetNamespace属性(参考W3C描述),该属性就定义了该XML模式所创建的命名空间,所有在该XML模式中声明的元素和定义的类型、属性都处于该命名空间内,这样在引用该命名空间的XML文档就可以引用那些元素和类型、属性了。
n1shema.xsd和n2schema.xsd的根元素xs:schema还可以定义elementFormDefault和attributeFormDefault属性(参考W3C描述),它们的值只能是qualified或unqualified,它们的默认值都是unqualified。elementFormDefault属性用于设定该XML模式创建的命名空间中的局部元素和类型被引用时是否需要指定的前缀;attributeFormDefault属性用于设定该XML模式创建的命名空间中的属性被引用时是否需要指定的前缀。

qualifiedSchema.xsd——两个属性都设为qualified
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="qualifiedSchema"
    targetNamespace="http://tempuri.org/qualifiedSchema.xsd"
    elementFormDefault="qualified" attributeFormDefault="qualified"
    xmlns="http://tempuri.org/qualifiedSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
>
  <xs:element name="books" type="BooksType"></xs:element>

  <xs:complexType name="BooksType">
    <xs:sequence>
      <xs:element name="book" type="BookType" minOccurs="1" maxOccurs="unbounded"></xs:element>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="BookType">
    <xs:sequence>
      <xs:element name="ISBN" type="xs:string"></xs:element>
      <xs:element name="Name" type="xs:string"></xs:element>
    </xs:sequence>
    <xs:attribute name="Category" type="xs:string"></xs:attribute>
  </xs:complexType>
</xs:schema>
 
qualifiedTest.xml
<?xml version="1.0" encoding="utf-8" ?>
<q:books xmlns:q="http://tempuri.org/qualifiedSchema.xsd">
  <q:book q:Category="Computer">
    <q:ISBN>7115134162</q:ISBN>
    <q:Name>C++ Primer Plus(第五版)</q:Name>
  </q:book>
  <q:book q:Category="Computer">
    <q:ISBN>7115134162</q:ISBN>
    <q:Name>C++ Primer Plus(第五版)</q:Name>
  </q:book>
</q:books>

由上可以看到qualifiedTest.xml中引用qualifiedSchema.xsd中定义的属性和元素时都加上了q:前缀。而下面的两段代码显示了elementFormDefault和attributeFormDefault属性设为unqualified的情形

unqualifiedSchema.xsd——两个属性都是用默认值unqualified
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="unqualifiedSchema"
    targetNamespace="http://tempuri.org/unqualifiedSchema.xsd"
    xmlns="http://tempuri.org/unqualifiedSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="books" type="BooksType"></xs:element>

  <xs:complexType name="BooksType">
    <xs:sequence>
      <xs:element name="book" type="BookType" minOccurs="1" maxOccurs="unbounded"></xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="BookType">
    <xs:sequence>
      <xs:element name="ISBN" type="xs:string"></xs:element>
      <xs:element name="Name" type="xs:string"></xs:element>
    </xs:sequence>
    <xs:attribute name="Category" type="xs:string"></xs:attribute>
  </xs:complexType>
</xs:schema>


unqualifiedTest.xml
<?xml version="1.0" encoding="utf-8" ?>
<q:books xmlns:q="http://tempuri.org/unqualifiedSchema.xsd">
  <book Category="Computer">
    <ISBN>7115134162</ISBN>
    <Name>C++ Primer Plus(第五版)</Name>
  </book>
  <book Category="Computer">
    <ISBN>7115134162</ISBN>
    <Name>C++ Primer Plus(第五版)</Name>
  </book>
</q:books>

但是,无论 elementFormDefault和attributeFormDefault属性设为qualified还是unqualified,引用XML模式中定义的全局元素都必须加上q:前缀(有种情况下,引用XML模式中定义的全局元素不需要加上前缀,该情况会在第三部分进行介绍)。
当然,这里还有一种特殊的情况:XML模式的schema元素没有定义targetNamespace属性,那么该XML模式就不会创建命名空间。
三、XML模式的引用方式
引用具有命名空间的XML模式
我们在编写XML实例文档时,可以引用本地XML模式创建的命名空间,也可以引用网络中可访问的XML模式定义的命名空间,但是它们的引用方式不一样。前面两部分的xml文件都是引用本地XML模式定义的命名空间。下面介绍一下如何引用网络中可访问的XML模式创建的命名空间。

测试xml
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://www.w3.org/2001/XMLSchema.xsd">
    <books>
        <book>
            <Name xsi:type="xs:string">C#入门到精通</Name>
            <Price xsi:type="xs:decimal">25.6</Price>
        </book>
    </books>
</root>

引用XML模式创建的命名空间,需要在XML实例文档的根元素定义xmlns:xxx属性,该属性值即为XML模式创建的命名空间,通过定义xmlns:xxx属性将xxx与XML模式创建的命名空间绑定起来,之后引用XML模式中定义的元素、属性和类型时加上xxx:前缀即可(如果XML模式的schema元素的elementFormDefault与attributeFormDefault为qualified)。如果引用的命名空间不是像http://www.w3.org/2001/XMLSchema这样通用的话,还必须指明创建该命名空间的XML模式文件的URI,这就是xsi:schemaLocation属性所做的事。xsi:schemaLocation属性值为“命名空间 XML模式文件的URI”的列表,各对之间使用空格相隔。上例中的xsi:schemaLocation属性值的意思是:创建http://www.w3.org/2001/XMLSchema命名空间的XML模式文档的URI为http://www.w3.org/2001/XMLSchema.xsd。
在第2部分提到:有种情况下,引用XML模式中定义的全局元素也不需要加上前缀。这是通过设定XML实例文档的默认命名空间来实现的。


defaultSchema.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="defaultSchema"
    targetNamespace="http://tempuri.org/defaultSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/defaultSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
    <xs:element name="root" type="RootType"></xs:element>

    <xs:complexType name="RootType">
        <xs:sequence>
            <xs:element name="Country" type="xs:string"></xs:element>
            <xs:element name="City" type="xs:string"></xs:element>
        </xs:sequence>
    </xs:complexType>

</xs:schema>
 
defaultNamespaceTest.xml——设定默认命名空间的XML实例文档
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns="http://tempuri.org/defaultSchema.xsd">
    <Country>China</Country>
    <City>Nanjing</City>
</root>

我们可以看到,在defaultNamespaceTest.xml中设定了根元素的xmlns属性,将该XML实例文档的默认命名空间设定为http://tempuri.org/defaultSchema.xsd,这样,在XML实例文档中引用defaultSchema.xsd中定义的全局元素root时,也可以不用加上特定的前缀。
引用没有命名空间的XML模式
在第2部分我们介绍了没有定义targetNamespace属性的XML模式是不会创建命名空间的,那么我们在编写XML实例文档时怎么引用无命名空间的XML模式中定义的属性、元素和类型呢?

本地无命名空间的XML模式
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="noNamespace"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
    <xs:element name="root" type="USAddress"></xs:element>

    <xs:complexType name="USAddress">
        <xs:sequence>
            <xs:element name="Country" type="xs:string"></xs:element>
            <xs:element name="City" type="xs:string"></xs:element>
            <xs:element name="District" type="xs:string"></xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:schema>


引用本地无命名空间的XML模式的XML实例文档
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="D:\VS2010 study\XmlStudy\XmlTest\noNamespace.xsd">
    <Country></Country>
    <City></City>
    <District></District>
</root>

上面的例子演示的是引用本地无命名空间的XML模式的方式,就是要设定xsi:noNamespaceSchemaLocation属性,它的值为本地XML模式文档所在的路径(可以是绝对路径,也可以是相对路径)。引用网络中无命名空间的XML模式的方式与引用本地无命名空间的XML模式是一样的,只需要将xsi:noNamespaceSchemaLocation属性的值设为网络中XML模式文档的URI。
转载自:http://www.cnblogs.com/martin-chen/archive/2011/02/24/xml-studynote-namespace.html
分享到:
评论
2 楼 蓝月儿 2012-08-10  
学习到很多,对这种文件有了更多的了解
1 楼 applepieone 2011-11-23  
很好,写得相当细致

相关推荐

    xml基础学习笔记

    XML 基础学习笔记 XML 文档基本结构: 1. 文档说明:一个完整的 XML 文档中必须包含一个文档说明,这个说明表示该文档是一个 XML 文挡,以及遵循那个 XML 版本的规范。最简单的文档说明如下:`&lt;?xml version=”1.0...

    PHPXML学习笔记

    2. **XML命名规则**:元素和属性名必须遵循一定的命名规则,如不能以数字开头,不能包含特殊字符等。 3. **XML声明**:XML文档通常以`&lt;?xml version="1.0" encoding="UTF-8"?&gt;`开始,定义了文档的版本和编码。 ### ...

    Dom4j学习教程+API+xml实用大全+xml学习笔记+htc

    标题"Dom4j学习教程+API+xml实用大全+xml学习笔记+htc"提及了几个关键主题,包括Dom4j的学习资源、API文档,以及关于XML的实用指南和学习笔记,还提到了一个名为"htc"的文件,可能是关于HTC设备或技术的文档。...

    MLDN学习笔记 —— XML学习笔记

    5. **DOM(Document Object Model)**:一种解析XML的方法,将XML文档转化为树形结构,便于程序操作。 6. **SAX(Simple API for XML)**:基于事件驱动的解析器,适用于处理大型XML文档,因为它不将整个文档加载到...

    北京圣思园xml学习笔记

    ### 北京圣思园XML学习笔记核心知识点详解 #### XML概述 - **XML全称**:eXtensible Markup Language(可扩展标记语言) - **学习XML的原因**: - 数据交换的需求日益增长,XML成为了电子商务的重要基础之一。 - ...

    XML 学习笔记,课件,实例

    本压缩包包含了关于XML的学习笔记、课件和实例,旨在帮助初学者全面理解和掌握XML的核心概念与应用。 XML的基础知识包括以下几个关键点: 1. **XML的基本结构**:XML文档由一系列元素构成,每个元素由起始标签(如...

    xml schema 学习笔记

    "XML Schema 学习笔记" XML Schema 是一种基于 XML 的语言,用于定义 XML 文档的结构和约束。它可以描述 XML 文档的格式、元素、属性、数据类型、默认值、固定值等信息。XML Schema 的作用类似于 DTD,但它具有更多...

    XML基础学习笔记指南

    DOM将整个XML文档加载到内存中,形成一棵树形结构,允许开发者遍历和修改文档的任何部分,适合处理小到中等规模的XML文档。而SAX是一种事件驱动的解析方法,仅在遇到文档元素时触发事件,占用资源较少,适用于处理...

    XML学习大全(适合开发人员)

    《XML学习笔记.doc》可能包含了个人或团队在学习过程中整理的要点、难点解析、实战经验,以及一些易错点和最佳实践,这些都是理论知识之外的宝贵经验。 总的来说,这个“XML学习大全”资料包全面覆盖了XML的基础到...

    xml学习笔记

    在XML学习笔记中,我们可能会遇到以下几个关键知识点: 1. **XML基本结构**:XML文档由元素(Element)、属性(Attribute)、文本(Text)、注释(Comment)、处理指令(Processing Instruction)等组成。每个XML...

    xml学习笔记.docx

    XML的学习不仅仅是理解这些基本概念,还包括命名空间、DTD(文档类型定义)或XML Schema的使用,XPath和XSLT(用于查询和转换XML)等高级主题。掌握XML能帮助开发者更好地理解和处理结构化数据,从而在各种应用场景...

    XML学习笔记

    XML(eXtensible Markup Language)是一种用于标记数据的语言,其设计目的是传输和存储数据,而非显示数据。XML起源于1998年W3C(World Wide Web ...在"XML学习笔记"中,你将深入学习到这些知识,从而提升你的XML技能。

    xml学习笔记.pdf

    在XML中,文档的结构由一系列的元素(标签)组成,元素是XML文档的基本构建块。元素可以通过属性来提供额外的信息。例如,在描述图书信息的例子中,`&lt;book&gt;`元素代表一本书,它带有`id`属性来标识图书的唯一性,`...

    XML高级编程学习笔记

    XML(eXtensible Markup Language...通过《XML高级编程》的学习,读者可以深入了解XML的各个方面,并掌握如何在实际项目中应用这些技术,无论是构建Web服务、数据交换,还是处理复杂的XML文档,都将变得更加得心应手。

    MyBatis学习笔记(一):MyBatis configuration和mapper xml配置总结

    在MyBatis的学习过程中,理解其配置和Mapper XML文件的设置是至关重要的。本笔记将详细解析MyBatis的configuration配置文件和Mapper XML配置,帮助你深入掌握这两个核心组件。 首先,我们来看MyBatis的`...

    浅显易懂的XML学习笔记全集

    XML,即可扩展标记语言(Extensible Markup Language),是一种用于存储和传输数据的标准化格式,由W3C(万维网联盟)制定。XML的设计目标是承载数据,而不是像HTML那样用于显示数据,使得数据与呈现方式分离,提高...

    Schama —— Xml文档约束技术 学习笔记

    **Schama —— XML文档约束技术 学习笔记** XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件、Web服务等场景。为了确保XML文档的数据结构正确、完整,避免数据错误,XML...

Global site tag (gtag.js) - Google Analytics