本篇文章給大家分享的是有關XML中的schema是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
經(jīng)過一番艱苦的學習和研究,終于將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的直接子節(jié)點,包括元素聲明、屬性聲明、復雜/簡單類型定義、組定義、屬性組定義
<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,也就是規(guī)定了只有全局成分才被定義在目標名稱空間中。將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后,其內(nèi)部定義的元素,屬性,類型等都屬于該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文件中用到的所有新創(chuàng)的元素、屬性等的.xsd文件都必須在這里聲明。
<xsi:schemaLocation="list of anyURI" >
其中的anyURI是一個架構位置,該架構包含限定的(具有名稱空間的架構)架構構造。每一對中的第一個 URI 引用是名稱空間名稱,第二個則是描述名稱空間的架構的位置。
將具有目標名稱空間的架構文檔與實例文檔相關聯(lián)。可以列出多對
URI 引用,每一對都有不同的名稱空間名稱部分。
根據(jù)萬維網(wǎng)聯(lián)合會 (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的優(yōu)勢),但XML和Schema都有各自的獨特的屬性,這也是由他們不同的功能決定的,Schema主要給XML提供服務,所以會規(guī)定好targetNameSpace來聲明命名空間的名字,而XML需要使用schema的服務,所以需要SchemaLocation來聲明使用的命名空間。
上文把XML和Schema的命名空間的一些相關內(nèi)容進行了詳細介紹,下面通過例子來具體了解:
例一:重點理解名稱空間的相關概念。下面的例子是一個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相關聯(lián),名為"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.php.cn/",表明此schema中使用的元素和數(shù)據(jù)類型來自于"http://www.php.cn/"名稱空間(namespace)。它同樣指出來自于"http://www.php.cn/"名稱空間的元素和數(shù)據(jù)類型必須使用帶"xsd:
"前綴。作為名稱空間的標識符(在聲明中作為元素或屬性的前綴),你也可以不使用xsd或xsi。這個 xmlns屬性包含了基本的XML schema元素,比如element, attribute, complexType, group, simpleType等。
對于任何一個XML Schema定義文檔(XSD)都有一個最頂層的schema (XSD)元素。而且該schema (XSD)元素定義必須包含這個名稱空間:http://www.php.cn/。即此名稱空間是由XML模式規(guī)范定義的標準名稱空間-所有XML模式元素必須屬于該名稱空間。
此片段:targetNamespace="http://www.php.cn/",表明此schema (note, to, from, heading, body)定義的元素來自于"http://www.php.cn/"名稱空間。這個targetNamespace屬性表示了該schema所對應的名稱空間的URI。也就是說在引用該Schema的其它文檔(包括自身文檔)中要聲明名稱空間,其URI應該是targetNamespace的屬性值。例如在這里因為要用到note.xsd自己定義的擴展數(shù)據(jù)類型(note,
to, from, heading, body),所以也聲明了名稱空間xmlns="http://www.php.cn/"。而且該名稱空間是默認名稱空間(沒有前綴)。targetNamespace屬性為在模式中顯式創(chuàng)建的所有新類型均聲明了XML名稱空間。
我們再來看由該schema規(guī)定的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的名稱空間相結合來規(guī)定該XML文檔。(即該文檔用到了此名稱空間中定義的數(shù)據(jù)) xmlns:xsi="http://www.php.cn/" 是任何XML實例文檔固有的XML模式實例名稱空間,它由XML模式規(guī)范定義。而xsi:schemaLocation="http://www.php.cn/.com note.xsd"則規(guī)定了該名稱空間所對應的schema的位置,即在相同路徑的note.xsd文件。
例二:重點理解Schema文檔使用自身定義類型xsd文件中定義了一個targetNameSpace后,其內(nèi)部定義的元素,屬性,類型等都屬于該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的命名空間的內(nèi)容應該就明了了。
以上就是XML中的schema是什么,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)頁題目:XML中的schema是什么-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://vcdvsql.cn/article6/cscdig.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、營銷型網(wǎng)站建設、云服務器、面包屑導航、虛擬主機、網(wǎng)站設計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容