XML和Schema名稱空間詳解---例項篇
阿新 • • 發佈:2019-02-08
上文把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文件和上文給出的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>
此片段:xmlns:xsd="http://www.w3.org/2001/XMLSchema",表明此schema中使用的元素和資料型別來自於"http://www.w3.org/2001/XMLSchema"名稱空間(namespace)。它同樣指出來自於"http://www.w3.org/2001/XMLSchema"名稱空間的元素和資料型別必須使用帶"xsd: "字首。作為名稱空間的識別符號(在宣告中作為元素或屬性的字首),你也可以不使用xsd或xsi。這個 xmlns屬性包含了基本的XML schema元素,比如element, attribute, complexType, group, simpleType等。
此片段:targetNamespace="http://www.w3schools.com",表明此schema (note, to, from, heading, body)定義的元素來自於"http://www.w3schools.com"名稱空間。這個targetNamespace屬性表示了該schema所對應的名稱空間的URI。也就是說在引用該Schema的其它文件(包括自身文件)中要宣告名稱空間,其URI應該是targetNamespace的屬性值。例如在這裡因為要用到note.xsd自己定義的擴充套件資料型別(note, to, from, heading, body),所以也聲明瞭名稱空間xmlns="http://www.w3schools.com"。而且該名稱空間是預設名稱空間(沒有字首)。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">
其中預設名稱空間宣告xmlns=""就是和剛剛宣告的XML Schema的名稱空間相結合來規定該XML文件。(即該文件用到了此名稱空間中定義的資料) xmlns:xsi="" 是任何XML例項文件固有的XML模式例項名稱空間,它由XML模式規範定義。而xsi:schemaLocation=" 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>
上述程式碼中,複雜型別stu是找不到的,因為你定義了一個名稱空間"
<?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定義的新元素與屬性的名稱空間。而""名稱空間則定義了element, attribute, complexType, group, simpleType等元素。
理解了上面的兩個例子,Schema的名稱空間的內容應該就明瞭了。