这是何等的痛的意会呀!
同一个学问点我最少阅读了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;"> 此例中,除了元素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)!