`
xierh21
  • 浏览: 23524 次
  • 性别: 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  
很好,写得相当细致

相关推荐

    day023-xml解析笔记和代码.rar

    设置命名空间 reader.getDocumentFactory().setXPathNamespaceURIs(map); 3. SAXReader对象调用read方法,将当前XML文件,转换为Document对象 document = reader.read(file); 4. 获取根节点...

    Visual C#学习笔记光盘

    Visual C#学习笔记光盘 简介:本书由浅入深地讲解Visual C# 2005编程知识,全书内容分为6篇,共27章,第一篇介绍Visual Studio 2005开发环境和C#基础,其中包括Visual C# 2005简介,C#语言基础,面向对象编程...

    net学习笔记及其他代码应用

    internal: 在同一命名空间内可以访问。 2 .列举ASP.NET 页面之间传递值的几种方式。 答. 1.使用QueryString, 如....?id=1; response. Redirect().... 2.使用Session变量 3.使用Server.Transfer 3. 一列数的规则...

    Log4j 学习笔记.doc

    Log4j 学习笔记. 1. Log4j的类图 2. Logger:日志写出器 1. Logger的输出方法 2. Logger的命名规则 3. Log level 4. 示例代码 5. 关于logger的两点说明 3. Appender:日志目的地 1. ConsoleAppender 2. ...

    LINQ中文教程LINQ中文教程

    一、命名空间 87 二、编程方式创建XML文档 88 三、使用 LINQ 查询创建XML文档 89 四、加载和解析XML内容 90 六、遍历内存中的XML文档 90 七、修改 XML文档 92 使用linq to xml 快速创建自己的Rss 93

    VS2008 LINQ基础教程

    一、命名空间 87 二、编程方式创建XML文档 88 三、使用 LINQ 查询创建XML文档 89 四、加载和解析XML内容 90 六、遍历内存中的XML文档 90 七、修改 XML文档 92 使用linq to xml 快速创建自己的Rss 93

    LINQ中文教程word格式

    一、命名空间 41 二、编程方式创建XML文档 41 三、使用 LINQ 查询创建XML文档 42 四、加载和解析XML内容 42 六、遍历内存中的XML文档 42 七、修改 XML文档 43 使用linq to xml 快速创建自己的Rss 44

    As3殿堂之路学习笔记

    本文档基于学习AS3殿堂之路学习总结而来, 主要包括:数据类型,流程控制,字符串,数组,函数,类和对象,命名空间的介绍。 以及XML,视觉编程,显示编程,动画编程的总结。 提供需要学习As3的盆友一个更好思路。

    LINQ详细教程

    一、命名空间 86 二、编程方式创建XML文档 87 三、使用 LINQ 查询创建XML文档 88 四、加载和解析XML内容 89 六、遍历内存中的XML文档 89 七、修改 XML文档 91 使用linq to xml 快速创建自己的Rss 92

    LINQ中文系列教程

    一、命名空间 87 二、编程方式创建XML文档 88 三、使用 LINQ 查询创建XML文档 89 四、加载和解析XML内容 90 六、遍历内存中的XML文档 90 七、修改 XML文档 92 使用linq to xml 快速创建自己的Rss 93

    c#学习笔记.txt

    C#学习笔记(2)【大 中 小】【打印】【加入收藏】【关闭】 【收藏到新浪ViVi】【收藏到365KEY】 浏览字号:日期:2004-07-11 人气:8092 出处: write by cash(天下第七) 2002.01.20 版权所有,翻录不究 cashcao@...

    LINQ中文教程(WORD格式)

    一、命名空间 87 二、编程方式创建XML文档 88 三、使用 LINQ 查询创建XML文档 89 四、加载和解析XML内容 90 六、遍历内存中的XML文档 90 七、修改 XML文档 92 使用linq to xml 快速创建自己的Rss 93

    LINQ基础教程(中文版) 适合初学者

    一、命名空间 87 二、编程方式创建XML文档 88 三、使用 LINQ 查询创建XML文档 89 四、加载和解析XML内容 90 六、遍历内存中的XML文档 90 七、修改 XML文档 92 使用linq to xml 快速创建自己的Rss 93

    Flex新手教程_入门级学习笔记

    1.2包与命名空间 Package and NameSpace 1 1.3构造方法Constructor 2 1.4变量和值 Variable 2 1.5赋值 2 1.6 AS数据类型 3 1.7数据类型转换 3 1.8实例方法,实例变量和静态方法,静态变量 4 1.9接口 Interface 4 1.10...

    Android学习之AppWidget笔记分享

    第一步:我们需要在res目录下创建一个folder,可以命名为xml(但这并不是必须的,你也可以换成你喜欢的名字)。然后在这么目录下创建一个xml文件。我的appwidget.xml文件代码如下: &lt;appwidget-provider xmlns:...

    asp.net知识库

    VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...

    利用python爬虫(part10)–Xpath节点集与函数

    学习笔记 编辑器:Sublime 注意:这里的理论部分是关于XML文档的,但是介于HTML和XML的相似性,大家可以自行做类比,有的地方我也会用HTML和XML做类比。 上一篇:Xpath与谓词的爱 文章目录节点集上使用谓词节点集上...

    子开膛手:从Netflix翻录字幕,以创建干净的成绩单进行语言学习

    按照,从所需的片段中提取字幕文件并另存为.xml文件。 需要有效的Netflix订阅。 使用您选择的字幕转换器来生成.csv文件。 我了允许从.xml转换为.csv那个。 使用下面的代码将其全部转换为一个漂亮的简单.txt文件。...

    毕设新项目-基于Java开发的宠物医院管理系统源码+项目使用说明+sql数据库+开发笔记.zip

    1. 在IDEA中打开本项目中的`shipPet`文件夹,点开文件夹下的`pom.xml`文件,使用Maven安装里面的依赖。 2. 修改`application-dev.yml`中`pet-ship`选项下的文件夹路径,为本项目(MixPet)下的那三个资源文件夹的路径...

    LINQ中文教程.pdf

    C# 2008 学习笔记 - LINQ to XML ............................................................................................. 87 一、命名空间 .............................................................

Global site tag (gtag.js) - Google Analytics