1. 程式人生 > >XML和Schema名稱空間詳解---例項篇

XML和Schema名稱空間詳解---例項篇

上文把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等。
     對於任何一個XML Schema定義文件(XSD)都有一個最頂層的schema (XSD)元素。而且該schema (XSD)元素定義必須包含這個名稱空間:http://www.w3.org/2001/XMLSchema。即此名稱空間是由XML模式規範定義的標準名稱空間-所有XML模式元素必須屬於該名稱空間。
     此片段: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的名稱空間的內容應該就明瞭了。