旗下导航:搜·么
当前位置:网站首页 > XML教程 > 正文

猖獗XML进修笔记(8)---------schema 的简朴范例【XML教程】,XML,学习笔记,schema

作者:搜教程发布时间:2019-12-01分类:XML教程浏览:81评论:0


导读:经由一番艰辛的进修和研讨,终究将XML的schema的基础原理弄通了!这是何等的痛的意会呀!同一个学问点我最少阅读了3遍,终究将此脉穴买通!运用过D...
经由一番艰辛的进修和研讨,终究将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.ki4.cn/”
targetNamespace=“http://www.ki4.cn/“>
   // Schema的目的称号空间用属性targetNamespace在根元素上定义。
   //Schema的全局身分被放在称号空间http://www.ki4.cn/里。
</span>

(2)Schema中的非全局身分 偶然愿望将非全局身分定义在目的空间中去,可运用下面要领。

<span style="font-family: SimSun; font-size: 14px;"><?xml version=”1.0”>
<xsd:schema xmlns:xsd=”http://www.ki4.cn/”
targetNamespace=“http://www.ki4.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.ki4.cn/”
targetNamespace=“http://www.ki4.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.ki4.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.ki4.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.ki4.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.ki4.cn/”
xmlns:newns=”http://www.ki4.cn/”>
   <name>Tom</name>
   <age>12</age>
   <newns:sex>male</sex>
</member_details>
//<span style="line-height: 26px;">&nbsp;此例中,除了元素sex被定义在新的称号空间中外,其他的元素依然运用本来的称号空间。</span></span>


(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 架构文档供应位置信息。

<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.ki4.cn/
      http://www.ki4.cn/
      http://www.ki4.cn/
      http://www.ki4.cn/
      http://www.ki4.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'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't forget me this weekend!</body>
</note>



此片断:xmlns:xsd="http://www.ki4.cn/",表明此schema中运用的元素和数据范例来自于"http://www.ki4.cn/"称号空间(namespace)。它一样指出来自于"http://www.ki4.cn/"称号空间的元素和数据范例必需运用带"xsd: "前缀。作为称号空间的标识符(在声明中作为元素或属性的前缀),你也能够不运用xsd或xsi。这个 xmlns属性包括了基础的XML schema元素,比方element, attribute, complexType, group, simpleType等。

关于任何一个XML Schema定义文档(XSD)都有一个最顶层的schema (XSD)元素。而且该schema (XSD)元素定义必需包括这个称号空间:http://www.ki4.cn/。即此称号空间是由XML形式范例定义的规范称号空间-一切XML形式元素必需属于该称号空间。
此片断:targetNamespace="http://www.ki4.cn/",表明此schema (note, to, from, heading, body)定义的元素来自于"http://www.ki4.cn/"称号空间。这个targetNamespace属性示意了该schema所对应的称号空间的URI。也就是说在援用该Schema的别的文档(包括本身文档)中要声明称号空间,其URI应当是targetNamespace的属性值。比方在这里由于要用到note.xsd本身定义的扩大数据范例(note, to, from, heading, body),所以也声清楚明了称号空间xmlns="http://www.ki4.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.ki4.cn/"就是和方才声明的XML Schema的称号空间相结合来划定该XML文档。(即该文档用到了此称号空间中定义的数据) xmlns:xsi="http://www.ki4.cn/" 是任何XML实例文档固有的XML形式实例称号空间,它由XML形式范例定义。而xsi:schemaLocation="http://www.ki4.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.ki4.cn/",该庞杂范例存在于"http://www.ki4.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.ki4.cn/"称号空间则定义了element, attribute, complexType, group, simpleType等元素。


明白了上面的两个例子,Schema的定名空间的内容应当就清楚明了了。

以上就是猖獗XML进修笔记(8)---------schema 的简朴范例 的内容,更多相干内容请关注ki4网(www.ki4.cn)!

标签:XML学习笔记schema


欢迎 发表评论: