目录
    1、声明名称空间" >    1、声明名称空间
   (1)Schema中的全局成分" >   (1)Schema中的全局成分
   3、XML文档中命名空间" >   3、XML文档中命名空间
    例一:重点理解名称空间的相关概念。" >    例一:重点理解名称空间的相关概念。
     例二:重点理解Schema文档使用自身定义类型" >     例二:重点理解Schema文档使用自身定义类型
首页 后端开发 XML/RSS教程 疯狂XML学习笔记(8)---------schema 的简单类型

疯狂XML学习笔记(8)---------schema 的简单类型

Feb 21, 2017 pm 02:39 PM

经过一番艰苦的学习和研究,终于将XML的schema的基本原理弄通了!

这是多么的痛的领悟呀!

同一个知识点我至少阅读了3遍,终于将此脉穴打通!

 

 

使用过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的直接子节点,包括元素声明、属性声明、复杂/简单类型定义、组定义、属性组定义

<span style="font-family: SimSun; font-size: 14px;"><?xml version=”1.0”>
<xsd:schema xmlns:xsd=”http://www.php.cn/”
targetNamespace=“http://www.php.cn/“>
   // Schema的目标名称空间用属性targetNamespace在根元素上定义。
   //Schema的全局成分被放在名称空间http://www.php.cn/里。
</span>
登录后复制

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

<span style="font-family: SimSun; font-size: 14px;"><?xml version=”1.0”>
<xsd:schema xmlns:xsd=”http://www.php.cn/”
targetNamespace=“http://www.php.cn/“
elementFormDefault=“qualified“></span>
登录后复制


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

<span style="font-family: SimSun; font-size: 14px;"><?xml version=”1.0”>
<xsd:schema xmlns:xsd=”http://www.php.cn/”
targetNamespace=“http://www.php.cn/“
attributeFormDefault=“qualified“></span>
登录后复制


也可以修改属性form的值,使得某些非全局成分不包含在名称空间中。如下:

<xsd:element name=”name” type=”xsd:string” form=”unqualified”/>
登录后复制

(3)targetNamespace

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

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

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


3、XML文档中命名空间

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

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

<span style="font-family: SimSun; font-size: 14px;"><?xml version=”1.0”?>
<member_details xmlns=”http://www.php.cn/”>
   <name>Tom</name>
   <age>12</age>
   <sex>male</sex>
</member_details></span>
登录后复制


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

<span style="font-family: SimSun; font-size: 14px;"><?xml version=”1.0”?>
<member_details>
   <name xmlns=”http://www.php.cn/”>Tom</name>
   <age>12</age>
   <sex>male</sex>
</member_details></span>
登录后复制


(3)嵌套的命名空间

<span style="font-family: SimSun; font-size: 14px;"><?xml version=”1.0”?>
<member_details xmlns=”http://www.php.cn/”
xmlns:newns=”http://www.php.cn/”>
   <name>Tom</name>
   <age>12</age>
   <newns:sex>male</sex>
</member_details>
//<span style="line-height: 26px;"> 此例中,除了元素sex被定义在新的名称空间中外,其余的元素仍然使用原来的名称空间。</span></span>
登录后复制


(4)schemaLocation


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

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

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

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

<span style="font-family: SimSun; font-size: 14px;"><p:Person
   xmlns:p="http://contoso.com/People"
   xmlns:v="http://contoso.com /Vehicles"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation=
     "http://contoso.com/People
      http://www.php.cn/
      http://www.php.cn/
      http://www.php.cn/
      http://www.php.cn/
      http://www.php.cn/">
   <name>John</name>
   <age>28</age>
   <height>59</height>
   ....
</p:Person></span>
登录后复制


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

上文把XML和Schema的命名空间的一些相关内容进行了详细介绍,下面通过例子来具体了解:

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

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

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<xsd:element name="note">
      <xsd:complexType>
         <xsd:sequence>
           <xsd:element name="to" type="xs:string"/>
           <xsd:element name="from" type="xs:string"/>
           <xsd:element name="heading" type="xs:string"/>
           <xsd:element name="body" type="xs:string"/>
        </xsd:sequence>
      </xsd:complexType>
</xsd:element>
</xsd:schema>
登录后复制
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<xsd:element name="note">
      <xsd:complexType>
         <xsd:sequence>
           <xsd:element name="to" type="xs:string"/>
           <xsd:element name="from" type="xs:string"/>
           <xsd:element name="heading" type="xs:string"/>
           <xsd:element name="body" type="xs:string"/>
        </xsd:sequence>
      </xsd:complexType>
</xsd:element>
</xsd:schema>
登录后复制


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

 
<?xml version="1.0"?>
<note xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don&#39;t forget me this weekend!</body>
</note>
<?xml version="1.0"?>
<note xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don&#39;t forget me this weekend!</body>
</note>
登录后复制



此片段:xmlns:xsd="http://www.php.cn/",表明此schema中使用的元素和数据类型来自于"http://www.php.cn/"名称空间(namespace)。它同样指出来自于"http://www.php.cn/"名称空间的元素和数据类型必须使用带"xsd: "前缀。作为名称空间的标识符(在声明中作为元素或属性的前缀),你也可以不使用xsd或xsi。这个 xmlns属性包含了基本的XML schema元素,比如element, attribute, complexType, group, simpleType等。

对于任何一个XML Schema定义文档(XSD)都有一个最顶层的schema (XSD)元素。而且该schema (XSD)元素定义必须包含这个名称空间:http://www.php.cn/。即此名称空间是由XML模式规范定义的标准名称空间-所有XML模式元素必须属于该名称空间。
此片段:targetNamespace="http://www.php.cn/",表明此schema (note, to, from, heading, body)定义的元素来自于"http://www.php.cn/"名称空间。这个targetNamespace属性表示了该schema所对应的名称空间的URI。也就是说在引用该Schema的其它文档(包括自身文档)中要声明名称空间,其URI应该是targetNamespace的属性值。例如在这里因为要用到note.xsd自己定义的扩展数据类型(note, to, from, heading, body),所以也声明了名称空间xmlns="http://www.php.cn/"。而且该名称空间是默认名称空间(没有前缀)。targetNamespace属性为在模式中显式创建的所有新类型均声明了XML名称空间。

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


 
<note xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
<note xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
登录后复制

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


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

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

 
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
elementFormDefault="qualified">
<xsd:element name="note">
      <xsd:complexType>
        <xsd:sequence>
       <xsd:element name="to" type="xs:string"/>
       <xsd:element name="from" type="xs:string"/>
<xsd:element name="heading" type="xs:string"/>
       <xsd:element name="body" type="xs:string"/>
       </xsd:sequence>
      </xsd:complexType>
</xsd:element>
<xsd:element name="Student" type="stu"/>
  <xsd:complexType name="stu">
  <xsd:sequence>
   <xsd:element name="Name" type="xs:string"/>
   <xsd:element name="Class" type="xs:string"/>
  </xsd:sequence>
 </xsd:complexType>
</xsd:schema>
登录后复制


<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
elementFormDefault="qualified">
<xsd:element name="note">
      <xsd:complexType>
        <xsd:sequence>
       <xsd:element name="to" type="xs:string"/>
       <xsd:element name="from" type="xs:string"/>
<xsd:element name="heading" type="xs:string"/>
       <xsd:element name="body" type="xs:string"/>
       </xsd:sequence>
      </xsd:complexType>
</xsd:element>
<xsd:element name="Student" type="stu"/> 
  <xsd:complexType name="stu"> 
  <xsd:sequence> 
   <xsd:element name="Name" type="xs:string"/> 
   <xsd:element name="Class" type="xs:string"/> 
  </xsd:sequence> 
 </xsd:complexType> 
</xsd:schema>
登录后复制


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

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns:student="http://www.w3schools.com"
elementFormDefault="qualified">
<xsd:element name="note">
      <xsd:complexType>
        <xsd:sequence>
       <xsd:element name="to" type="xs:string"/>
       <xsd:element name="from" type="xs:string"/>
<xsd:element name="heading" type="xs:string"/>
       <xsd:element name="body" type="xs:string"/>
       </xsd:sequence>
      </xsd:complexType>
</xsd:element>
<xsd:element name="Student" type="student:stu"/>
  <xsd:complexType name="stu">
  <xsd:sequence>
   <xsd:element name="Name" type="xs:string"/>
   <xsd:element name="Class" type="xs:string"/>
  </xsd:sequence>
 </xsd:complexType>
</xsd:schema>
登录后复制



<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns:student="http://www.w3schools.com"
elementFormDefault="qualified">
<xsd:element name="note">
      <xsd:complexType>
        <xsd:sequence>
       <xsd:element name="to" type="xs:string"/>
       <xsd:element name="from" type="xs:string"/>
<xsd:element name="heading" type="xs:string"/>
       <xsd:element name="body" type="xs:string"/>
       </xsd:sequence>
      </xsd:complexType>
</xsd:element>
<xsd:element name="Student" type="student:stu"/> 
  <xsd:complexType name="stu"> 
  <xsd:sequence> 
   <xsd:element name="Name" type="xs:string"/> 
   <xsd:element name="Class" type="xs:string"/> 
  </xsd:sequence> 
 </xsd:complexType> 
</xsd:schema>
登录后复制


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


    理解了上面的两个例子,Schema的命名空间的内容应该就明了了。

 

以上就是疯狂XML学习笔记(8)---------schema 的简单类型 的内容,更多相关内容请关注PHP中文网(www.php.cn)!


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

能否用PowerPoint打开XML文件 能否用PowerPoint打开XML文件 Feb 19, 2024 pm 09:06 PM

XML文件可以用PPT打开吗?XML,即可扩展标记语言(ExtensibleMarkupLanguage),是一种被广泛应用于数据交换和数据存储的通用标记语言。与HTML相比,XML更加灵活,能够定义自己的标签和数据结构,使得数据的存储和交换更加方便和统一。而PPT,即PowerPoint,是微软公司开发的一种用于创建演示文稿的软件。它提供了图文并茂的方

使用Python实现XML数据的合并和去重 使用Python实现XML数据的合并和去重 Aug 07, 2023 am 11:33 AM

使用Python实现XML数据的合并和去重XML(eXtensibleMarkupLanguage)是一种用于存储和传输数据的标记语言。在处理XML数据时,有时候我们需要将多个XML文件合并成一个,或者去除重复的数据。本文将介绍如何使用Python实现XML数据的合并和去重的方法,并给出相应的代码示例。一、XML数据合并当我们有多个XML文件,需要将其合

Python中的XML数据转换为CSV格式 Python中的XML数据转换为CSV格式 Aug 11, 2023 pm 07:41 PM

Python中的XML数据转换为CSV格式XML(ExtensibleMarkupLanguage)是一种可扩展标记语言,常用于数据的存储和传输。而CSV(CommaSeparatedValues)则是一种以逗号分隔的文本文件格式,常用于数据的导入和导出。在处理数据时,有时需要将XML数据转换为CSV格式以便于分析和处理。Python作为一种功能强大

使用Python实现XML数据的筛选和排序 使用Python实现XML数据的筛选和排序 Aug 07, 2023 pm 04:17 PM

使用Python实现XML数据的筛选和排序引言:XML是一种常用的数据交换格式,它以标签和属性的形式存储数据。在处理XML数据时,我们经常需要对数据进行筛选和排序。Python提供了许多有用的工具和库来处理XML数据,本文将介绍如何使用Python实现XML数据的筛选和排序。读取XML文件在开始之前,我们需要先读取XML文件。Python有许多XML处理库,

使用PHP将XML数据导入数据库 使用PHP将XML数据导入数据库 Aug 07, 2023 am 09:58 AM

使用PHP将XML数据导入数据库引言:在开发中,我们经常需要将外部数据导入到数据库中进行进一步的处理和分析。而XML作为一种常用的数据交换格式,也经常被用来存储和传输结构化数据。本文将介绍如何使用PHP将XML数据导入数据库。步骤一:解析XML文件首先,我们需要解析XML文件,提取出需要的数据。PHP提供了几种解析XML的方式,其中最常用的是使用Simple

Python实现XML和JSON之间的转换 Python实现XML和JSON之间的转换 Aug 07, 2023 pm 07:10 PM

Python实现XML和JSON之间的转换导语:在日常的开发过程中,我们常常需要将数据在不同的格式之间进行转换。XML和JSON是常见的数据交换格式,在Python中,我们可以使用各种库来实现XML和JSON之间的相互转换。本文将介绍几种常用的方法,并附带代码示例。一、XML转JSON在Python中,我们可以使用xml.etree.ElementTree模

使用Python处理XML中的错误和异常 使用Python处理XML中的错误和异常 Aug 08, 2023 pm 12:25 PM

使用Python处理XML中的错误和异常XML是一种常用的数据格式,用于存储和表示结构化的数据。当我们使用Python处理XML时,有时可能会遇到一些错误和异常。在本篇文章中,我将介绍如何使用Python来处理XML中的错误和异常,并提供一些示例代码供参考。使用try-except语句捕获XML解析错误当我们使用Python解析XML时,有时候可能会遇到一些

Python解析XML中的特殊字符和转义序列 Python解析XML中的特殊字符和转义序列 Aug 08, 2023 pm 12:46 PM

Python解析XML中的特殊字符和转义序列XML(eXtensibleMarkupLanguage)是一种常用的数据交换格式,用于在不同系统之间传输和存储数据。在处理XML文件时,经常会遇到包含特殊字符和转义序列的情况,这可能会导致解析错误或者误解数据。因此,在使用Python解析XML文件时,我们需要了解如何处理这些特殊字符和转义序列。一、特殊字符和

See all articles