DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 准備 XML 及相關技術認證,第 2 部分: 信息建模(2)
准備 XML 及相關技術認證,第 2 部分: 信息建模(2)
編輯:XML詳解     

定義 XML Schema

  W3C XML Schema 是一種本身其實是 XML 文檔的文法文檔。Schematron 和 Relax NG 是另外兩種 XML 驗證語言。這裡只討論 W3C XML Schema,另外的 XML 驗證語言比較簡單,也很流行,您可以自己去了解。

  與使用 DTD 相比,設計 XML Schema 可以在更大程度上約束文檔。比方說,XML Schema 文法可以規定有且只能有四個 apple 元素作為 basket 元素的直接子元素。可以在字符串類型的基礎上定義復雜的類型。比如,可以要求 zipcode 元素的值必須具有 "ddddd-dddd" 的刻面,所以 "95123-4823" 是有效的,而 "abcde-fghi" 或者 "27703" 都是無效的。

  刻面(facet)這個詞是什麼意思呢?XML Schema 將刻面 看作是一種簡單數據類型的可能值的某個方面。表 5 顯示了 XML Schema 的刻面。

  表 5. XML W3C Schema 刻面

  

刻面類型 說明 length 規定具體的長度 minLength 規定字符串派生類型的最小長度 maxLength 規定字符串派生類型的最大長度 maxExclusive 必須小於等於適合於該類型的最大值 maxInclusive 必須小於適合於該類型的最大值 minExclusive 必須大於適合於該類型的最小值 minInclusive 必須大於等於適合於該類型的最小值 enumeration 值必須是所定義列表中的一個成員 totalDigits 規定總的數字位數,不算正負號和小數點 fractionDigits 規定小數中的小數位數 whiteSpace 用於保留、替換或壓縮文檔空白

  這裡僅僅是告訴您能夠在多大粒度上施加控制,但首先要制作一個能夠實現 DTD 功能的 XML Schema。後面再討論如何進一步細化,說明模式的優點。

  首先要聲明 XML Schema 使用的模式。暫時先不要在文法中使用名稱空間。模式本身使用了一個名稱空間。按照慣例一般使用前綴 “xs” 來表示。前綴可使用任何字符串,比如 “radish”,但是有什麼理由違反慣例呢?

xmlns:xs="http://www.w3.org/2001/XMLSchema"

  現在,聲明您自己的已聲明元素和屬性是非限定的:

  elementFormDefault="unqualifIEd"
  attributeFormDefault="unqualifIEd"

  下面是 XML Schema 根元素:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="unqualifIEd"
  attributeFormDefault="unqualifIEd">

  接下來可以指定 publications,以及 book、title、author、copyright、publisher 和 isbn 元素聲明了。 可以像下面這樣指定根元素:

<xs:element name="publications">

  publications 根是一個復雜類型,包含其他元素序列,即可選的 book 元素。該元素出現的最多次數沒有限制:

<xs:element name="publications">
 <xs:complexType>
  <xs:sequence>
  <xs:element name="book" maxOccurs="unbounded">

  book 又是一個復雜類型,包含自己的序列:title、author、copyright、publisher 和 isbn 元素聲明。

<xs:element name="publications">
 <xs:complexType>
  <xs:sequence>
  <xs:element name="book" maxOccurs="unbounded">
   <xs:complexType>
   <xs:sequence>
    <xs:element name="title"/>
    <xs:element name="author"/>
    <xs:element name="copyright"/>
    <xs:element name="publisher"/>
    <xs:element name="isbn"/>
   </xs:sequence>
  ...

  是不是忘記了為 book 元素增加 id 和 image 屬性?沒有,這些可以放在 book 元素所包圍的復雜類型定義的最後完成。

  XML Schema 的規則(文法)要求在所屬元素包含的復雜類型定義的最後聲明屬性。屬性是形如 <xs:attribute … /> 的模式元素。

  因此可以這樣添加 id 和 image 屬性:

<xs:element name="publications">
 <xs:complexType>
  <xs:sequence>
  <xs:element name="book" maxOccurs="unbounded">
   <xs:complexType>
   <xs:sequence>
    <xs:element name="title"/>
    <xs:element name="author"/>
    <xs:element name="copyright"/>
    <xs:element name="publisher"/>
    <xs:element name="isbn"/>
   </xs:sequence>
   <xs:attribute name="id" type="xs:string" use="required"/>
   <xs:attribute name="image" type="xs:string"/>
   </xs:complexType>

  id 屬性是必需的,而 image 屬性使用了默認值,即可選的。

  注意類型 xs:string。也可以指定基於 string 的復雜類型。這對於 XML 來說仍然是字符串,但是對於 XML Schema 來說則是一種特殊類型的字符串。稍後將進一步討論用戶定義的復雜類型。

  現在模式已經基本上完成了。為打開的元素加上結束標記,如 清單 11 所示。

  清單 11. 與 DTD 功能匹配的模式

<?XML version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="qualifIEd"
  attributeFormDefault="unqualifIEd">
<xs:element name="publications">
 <xs:complexType>
  <xs:sequence>
  <xs:element name="book" maxOccurs="unbounded">
   <xs:complexType>
   <xs:sequence>
    <xs:element name="title"/>
    <xs:element name="author"/>
    <xs:element name="copyright"/>
    <xs:element name="publisher"/>
    <xs:element name="isbn"/>
   </xs:sequence>
   <xs:attribute name="id" type="xs:string" use="required"/>
   <xs:attribute name="image" type="xs:string"/>
   </xs:complexType>
  </xs:element>
  </xs:sequence>
 </xs:complexType>
</xs:element>
</xs:schema>

  可以在 XMLSpy 中打開 publication3.xsd,然後按 F8 針對 http://www.w3.org/2001/XMLSchema 對它進行驗證,就好像它是 XML 文檔一樣,因為它就是 XML 文檔。

  將 XML Schema 關聯到文檔

  只有應用於 XML 文檔時模式才有意義。如何將模式關聯到文檔呢?該應用程序可直接使用 publications3.xsd 驗證 publications3.xml 文檔。但是我們需要將模式和 XML 文檔隱含地關聯在一起。

  可以修改文檔的根元素通過專門的屬性鏈接到模式。到目前為止模式還沒有使用名稱空間。必須為 publications 根元素增加一個屬性,告訴解析器到哪裡找到不帶名稱空間的模式:

<publications xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:noNamespaceSchemaLocation="publications3.xsd">

  僅此而已!請參見 清單 12 中所示的 publications3.XML 文檔。文檔的內容與 清單 8 相同,不過增加了模式關聯。

  清單 12. 鏈接到 W3C XML Schema 的 publication3.XML

<?XML version="1.0" encoding="UTF-8"?>
<publications xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="publications3.xsd">
   <book id="_1001">
      <title>Building J2EE Applications With IBM WebSphere</title>
      <author>Nilsson and Mauget</author>
      <copyright>2003</copyright>
      <publisher>Wiley</publisher>
      <isbn>0471281573</isbn>
   </book>
   <book id="_3042">
      <title>Linux and Windows InterOperability Guide</title>
      <author>Bradford and Mauget</author>
      <copyright>2001</copyright>
      <publisher>Pearson Education</publisher>
      <isbn>0130324779</isbn>
   </book>
   <book id="_9593" image="edir.jpg">
      <title>e - DirectorIEs</title>
      <author>House,Hahn,Mauget,Daugherty</author>
      <copyright>2000</copyright>
      <publisher>Pearson Education</publisher>
      <isbn>0471281573</isbn>
   </book>
</publications>

  增加名稱空間

  為什麼要在文檔中增加名稱空間呢?DTD 根本沒有名稱空間的概念。它忽略名稱空間限定元素或屬性中的冒號(:)。這意味著任何消歧都是使用冒號前面的前綴來完成的,而不是通過前綴所表示的 URI。兩個文檔使用相同的前綴關聯到不同名稱空間是合法的,但是可能會造成命名沖突的問題。

  在文檔中使用下面的名稱空間:

http://rogers60.com/XMLtutorial/2

  前綴使用 pub,雖然可使用文檔和模式中惟一的任何有效字符串。對於 DTD 而言,pub:book 和 pubbook 沒有什麼區別。

  在 XML Schema 名稱空間的支持下,概念上相當於 http://rogers60.com/XMLtutorial/2book。

  DTD 的行為不一定能防止名稱空間沖突。另一方面,只要正確地聲明,XML Schema 的行為則可以防止名稱空間沖突,因為基於 DNS 的 URI 是惟一的。模式演化的下一小步是設置默認名稱空間,前綴用 pub:

xmlns:pub="http://rogers60.com/XMLtutorial/2"

  需要同時用兩個屬性來指定一個名稱空間和使用默認名稱空間。一般的慣例是假定不帶前綴的元素在默認名稱空間中,但不帶前綴的屬性不屬於任何名稱空間:

elementFormDefault="qualifIEd"
attributeFormDefault="unqualifIEd"

  記得在前面不使用名稱空間的文法中聲明了 elementFormDefault="unqualifIEd"。對這個具體的模式而言,使用名稱空間限定的文法不需要增加什麼。參見 清單 13。

  清單 13. 使用默認名稱空間的模式

<?XML version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:pub="http://rogers60.com/XMLtutorial/2"
  targetNamespace="http://rogers60.com/XMLtutorial/2"
  elementFormDefault="qualifIEd"
  attributeFormDefault="unqualifIEd">
<xs:element name="publications">
 <xs:complexType>
  <xs:sequence>
  <xs:element name="book" maxOccurs="unbounded">
   <xs:complexType>
   <xs:sequence>
    <xs:element name="title"/>
    <xs:element name="author"/>
    <xs:element name="copyright"/>
    <xs:element name="publisher"/>
    <xs:element name="isbn"/>
   </xs:sequence>
   <xs:attribute name="id" type="xs:string" use="required"/>
   <xs:attribute name="image" type="xs:string" use="optional"/>
   </xs:complexType>
  </xs:element>
  </xs:sequence>
 </xs:complexType>
</xs:element>
</xs:schema>

  還需要對 XML 文檔做一個小手術來將其連接到名稱空間。手術很小,因為整個文檔都在默認名稱空間中。publications 根元素中不必再指定不帶名稱空間的模式的位置屬性,而是改為:

xsi:schemaLocation="http://rogers60.com/XMLtutorial/2  publicationsNS4.xsd"

  這裡要注意。特別是用引號括起來的、用空格分開的值對。第一部分是名稱空間 URI,第二部分是模式文件的位置。一般來說應該是一個 URL。此外,還需要增加默認名稱空間並為其指定 pub 前綴:

  xmlns="http://rogers60.com/XMLtutorial/2"
  xmlns:pub="http://rogers60.com/XMLtutorial/2"

  這樣,非限定的元素就默認屬於 URI http://rogers60.com/XMLtutorial/2,明確指定前綴 pub 的元素也屬於該名稱空間。比如,<book> 和 <pub:book> 聲明了相同的元素。增加名稱空間後的測試文檔如 清單 14 所示。注意,作為一個例子,最後的 book 元素明確限定為 pub:book。該文檔對於前述 清單 13 中的模式是有效的。

  清單 14. 使用默認名稱空間的 XML 文檔

<?XML version="1.0" encoding="UTF-8"?>
<publications
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://rogers60.com/XMLtutorial/2 
  publicationsNS4.xsd"
  xmlns="http://rogers60.com/XMLtutorial/2"
  xmlns:pub="http://rogers60.com/XMLtutorial/2">
   <book id="_1001">
     <title>Building J2EE Applications With IBM WebSphere</title>
     <author>Nilsson and Mauget</author>
     <copyright>2003</copyright>
     <publisher>Wiley</publisher>
     <isbn>0471281573</isbn>
   </book>
   <book id="_3042">
     <title>Linux and Windows InterOperability Guide</title>
     <author>Bradford and Mauget</author>
     <copyright>2001</copyright>
     <publisher>Pearson Education</publisher>
     <isbn>0130324779</isbn>
   </book>
   <pub:book id="_9593" image="edir.jpg">
     <title>e - DirectorIEs</title>
     <author>House,Hahn,Mauget,Daugherty</author>
     <copyright>2000</copyright>
     <publisher>Pearson Education</publisher>
     <isbn>0471281573</isbn>
   </pub:book>
</publications>          

  內置的簡單數據類型

  W3C XML Schema 規范規定了一組簡單的內置數據類型。表 6 列出了內置的 XML Schema 簡單類型及其說明。本教程中的測試用例默認使用字符串類型,只有 book 元素的 image 和 id 屬性明確規定了該類型。

  表 6. 內置的 W3C Schema 簡單數據類型

  

類型 說明 anyURI 統一資源標識符 base64Binary base64 編碼的二進制值 boolean true .. false 或 0 ..1 byte 帶符號量,小於等於 128,大於等於 -127 dateTime 絕對日期和時間 ID, IDREF, IDREFS, ENTITY, ENTITIES, NOTATION, NMTOKEN, NMTOKENS 與 表 4 中的定義相同 integer 帶符號整數 language XML 1.0 推薦標准中的 “XML:lang” 值 name XML 名 string Unicode 字符串

  復雜應用程序中的數據文檔模式可能變得很大,難以維護,除非改造成某種規范化的形式。這裡模式已經在使用它們的結構點上聲明了元素和屬性。文檔結構以及用於構建該結構的元素和屬性的聲明混在了一起。這種方法對那些試圖理解和維護它的人來說可能降低了模式的清晰度。並且減少了類型重用的可能性,需要修改的時候維護人員很難找到需要的類型。

  為什麼不把類型聲明集中到一起,然後在模式中單獨的數據結構部分引用這些類型呢?這樣的話,您甚至可以將大型模式分解成不同的文件,分別作為類型部分和結構部分。

  我們來試試。修改模式將聲明部分從結構中分離出來,在文檔的開始部分聲明所有的元素,接下來聲明屬性,最後定義文檔結構。結構部分使用 ref 屬性和元素或屬性名來引用聲明的元素或屬性。屬性引用必須使用名稱空間前綴,因為所有的屬性都不知道名稱空間。

  這種規范化的模式布局有時候使大型文檔更容易閱讀,因為可以看到從不那麼冗長的結構中分離出來的聲明。此外,也有利於類型的重用。

  清單 15 顯示了采用這種規范化形式的一個小模式。它實際上比原來的模式長,但是由於聲明和結構分開,有些東西只需要聲明一次而不是多次,因此更便於維護。

  清單 15. 規范化的 W3C Schema

<?XML version="1.0" encoding="UTF-8"?>6
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:pub="http://rogers60.com/XMLtutorial/2"
  targetNamespace="http://rogers60.com/XMLtutorial/2"
  elementFormDefault="qualifIEd"
  attributeFormDefault="qualifIEd">
  <!-- Simple elements -->
  <xs:element name="title"/>
  <xs:element name="author"/>
  <xs:element name="copyright"/>
  <xs:element name="publisher"/>
  <xs:element name="isbn"/>
  <!-- Attributes -->
  <xs:attribute name="id" type="xs:string"/>
  <xs:attribute name="image" type="xs:string"/>
  <!-- Complex elements -->
  <xs:element name="publications">
   <xs:complexType>
     <xs:sequence>
      <xs:element name="book" maxOccurs="unbounded">
        <xs:complexType>
         <xs:sequence>
           <xs:element ref="pub:title"/>
           <xs:element ref="pub:author"/>
           <xs:element ref="pub:copyright"/>
           <xs:element ref="pub:publisher"/>
           <xs:element ref="pub:isbn"/>
         </xs:sequence>
         <xs:attribute ref="pub:id" use="required"/>
         <xs:attribute ref="pub:image" use="optional"/>
        </xs:complexType>
      </xs:element>
     </xs:sequence>
   </xs:complexType>
  </xs:element>
</xs:schema>

  將測試文檔鏈接到模式後,該模式仍然與以前一樣是有效的,因此不再贅述。現在從 XMLSpy 中打開該模式,然後單擊 Schema/WSDL 選項卡顯示 圖 7 所示的圖示。要注意序列的連接器符號、名稱空間限定的標簽和一堆 pub:book 元素。

  圖 7. W3C XML Schema 圖示

  准備 XML 及相關技術認證,第 2 部分: 信息建模

  模式顯示了一點細微的錯誤。您希望允許出現空白的 publications 列表,但是注意到這裡至少要求有一個 pub:book。空白的 publications 列表是無效的。堅持測試邊界條件是一種好習慣。可以通過向該元素增加 minOccurs 屬性來解決這個問題:

<xs:element name="book" maxOccurs="unbounded" minOccurs="0">

  這樣就允許空白的 publications 列表了。

  W3C XML Schema 包含內置的簡單類型,但是它的吸引力部分原因是能夠用更細粒度的用戶定義簡單類型來約束值。這裡可以創建兩種簡單類型,分別用於 isbn 元素和 copyright 元素。基類型都是 xs:string,但分別應用不同的限制范型。首先來看看版權格式。要保證它必須是一個四位數字。雖然這種簡單的限制有多種方法實現(比如指定長度的實數),但是這裡采用形如 "dddd" 的范型,其中每個 "d" 表示一個數字:

<xs:simpleType name="year">
 <xs:restriction base="xs:string">
  <xs:pattern value="dddd"/>
 </xs:restriction>
</xs:simpleType>

  類似地,將 ISBN 編號限制為 “d-dddd-dddd-d” 的形式,其中每個 “d” 也是一個數字。要知道,這並不是真正的權威格式。由於面臨著數字耗盡的問題,ISBN 最近從 10 位數改成了 13 位數。但是對本教程來說,這種形式適合測試文檔中的 ISBN 編號。

<xs:simpleType name="isbn">
 <xs:restriction base="xs:string">
  <xs:pattern value="d-dddd-dddd-d"/>
 </xs:restriction>
</xs:simpleType>

  將這兩小節 XML 插入到規范化模式中元素和屬性聲明的前面。然後就可以在需要的地方引用這些新類型了,只要使用 ref 屬性指向這些新類型即可:

<xs:attribute ref="pub:id" use="required"/>
<xs:attribute ref="pub:image" use="optional"/>

  ref 的值中使用了名稱空間前綴,因為屬性引用默認是沒有名稱空間的,正如該模式中 attributeFormDefault="unqualifIEd" 所規定的那樣。清單 16 顯示了使用簡單類型的最新 XML Schema 版本。這裡不再列出 XML 文檔,因為除了模式名稱以外沒有變化。

  清單 16. 聲明自定義類型的模式

<?XML version="1.0" encoding="UTF-8"?>
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:pub="http://rogers60.com/XMLtutorial/2"
  targetNamespace="http://rogers60.com/XMLtutorial/2"
  elementFormDefault="qualifIEd"
  attributeFormDefault="unqualifIEd">
<!-- Simple types -->
<xs:simpleType name="isbn">
 <xs:restriction base="xs:string">
  <xs:pattern value="d-dddd-dddd-d"/>
 </xs:restriction>
</xs:simpleType>
<xs:simpleType name="year">
 <xs:restriction base="xs:string">
  <xs:pattern value="dddd"/>
 </xs:restriction>
</xs:simpleType>
<!-- Simple elements -->
<xs:element name="title" type="xs:string"/>
<xs:element name="author" type="xs:string"/>
<xs:element name="copyright" type="pub:year"/>
<xs:element name="publisher" type="xs:string"/>
<xs:element name="isbn" type="pub:isbn"/>
<!-- Attributes -->
<xs:attribute name="id" type="xs:string"/>
<xs:attribute name="image" type="xs:string"/>
<!-- Complex elements -->
<xs:element name="publications">
 <xs:complexType>
  <xs:sequence>
  <xs:element name="book" maxOccurs="unbounded">
   <xs:complexType>
   <xs:sequence>
    <xs:element ref="pub:title"/>
    <xs:element ref="pub:author"/>
    <xs:element ref="pub:copyright"/>
    <xs:element ref="pub:publisher"/>
    <xs:element ref="pub:isbn"/>
   </xs:sequence>
   <xs:attribute ref="pub:id" use="required"/>
   <xs:attribute ref="pub:image" use="optional"/>
   </xs:complexType>
  </xs:element>
  </xs:sequence>
 </xs:complexType>
</xs:element>
</xs:schema>

  使用 XMLSpy 測試時文檔仍然是有效的。現在去掉第一個 isbn 元素中的第一個橫線再驗證。這樣將導致驗證失敗。圖 8 顯示了結果。

  圖 8. 自定義類型驗證失敗

  准備 XML 及相關技術認證,第 2 部分: 信息建模

  可以采用分而治之的辦法使模式更容易理解和維護。借用編程技術將模式分解成位於獨立文件中的聲明。首先,創建一個模式僅包含前述重構模式中的簡單類型、元素和屬性聲明。如 清單 17 所示。

  清單 17. 單獨模式文件中的聲明

<?XML version="1.0" encoding="UTF-8"?>
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:pub="http://rogers60.com/XMLtutorial/2"
  targetNamespace="http://rogers60.com/XMLtutorial/2"
  elementFormDefault="qualifIEd"
  attributeFormDefault="unqualifIEd">
<!-- Simple types -->
<xs:simpleType name="isbn">
 <xs:restriction base="xs:string">
  <xs:pattern value="d-dddd-dddd-d"/>
 </xs:restriction>
</xs:simpleType>
<xs:simpleType name="year">
 <xs:restriction base="xs:string">
  <xs:pattern value="dddd"/>
 </xs:restriction>
</xs:simpleType>
<!-- Simple elements -->
<xs:element name="title" type="xs:string"/>
<xs:element name="author" type="xs:string"/>
<xs:element name="copyright" type="pub:year"/>
<xs:element name="publisher" type="xs:string"/>
<xs:element name="isbn" type="pub:isbn"/>
<!-- Attributes -->
<xs:attribute name="id" type="xs:string"/>
<xs:attribute name="image" type="xs:string"/>
</xs:schema>

  然後將這些內容從原始模式的副本中刪除,替換為下列標記:

<xs:include schemaLocation="publicationsRedefine8.xsd"/>

  最終得到的結構模式如 清單 18 所示。該 ref 屬性引用要包含的模式。可以看到兩個文件更容易讀了。一個包含元素、屬性和類型聲明。另一個則將其組織到文檔結構中。如果將測試 XML 文件中的鏈接改為指向 publications8.xsd,在 XMLSpy 中該文件仍然是有效的。

  清單 18. 結構性 W3C Schema

<?XML version="1.0" encoding="UTF-8"?>
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:pub="http://rogers60.com/XMLtutorial/2"
  targetNamespace="http://rogers60.com/XMLtutorial/2"
  elementFormDefault="qualifIEd"
  attributeFormDefault="unqualifIEd">
<xs:include schemaLocation="publicationsRedefine8.xsd"/>
<!-- Complex elements -->
<xs:element name="publications">
 <xs:complexType>
  <xs:sequence>
  <xs:element name="book" maxOccurs="unbounded">
   <xs:complexType>
   <xs:sequence>
    <xs:element ref="pub:title"/>
    <xs:element ref="pub:author"/>
    <xs:element ref="pub:copyright"/>
    <xs:element ref="pub:publisher"/>
    <xs:element ref="pub:isbn"/>
   </xs:sequence>
   <xs:attribute ref="pub:id" use="required"/>
   <xs:attribute ref="pub:image" use="optional"/>
   </xs:complexType>
  </xs:element>
  </xs:sequence>
 </xs:complexType>
</xs:element>
</xs:schema>

  在 XML Schema 中,可以使用 xs:include、xs:redefine 或 xs:import 來引入外部文件,通過 xs:extension 或 xs:restriction 元素派生新的類型。這些內容足以單獨用一篇教程來討論。

  決定使用 DTD 還是 W3C XML Schema

  本教程介紹了 DTD 和 W3C XML Schema。現在對兩者加以比較。

  表 7 列出了 DTD 的基本驗證特性。對於控制元素值和屬性值的格式和類型只有很少的粒度可供選擇。這對於敘述風格的文檔一般已經足夠了。事實上,對於各種面向工業的敘述性的交換文檔存在數量驚人的標准 DTD。

  表 7. DTD 驗證

  

DTD 有效性約束 元素嵌套 元素頻次 允許的元素數據 屬性類型和默認值

  類數據記錄的文檔構成了 XML 應用的另一個主要分支。對象和 XML 之間的雙向轉換需要精確的內容規范。這正是 W3C XML Schema 大顯身手的地方。表 8 簡要描述了模式的約束特性。要注意 XML Schema 和 DTD 有一些重疊,但是 XML Schema 能夠為文法組成新的數據類型。重疊的特性容易造成誤解。XML Schema 支持更精確的控制,比如元素的頻次。比方說可以要求 publication 列表包含而且只能包含 10 本書。在 DTD 中這是不可能的。

  表 8. W3C Schema 特性

  

W3C XML Schema 特性 元素頻次約束 名稱空間限定的元素和屬性聲明 簡單數據類型和復雜數據類型 類型派生和繼承

  對於定義面向數據的文法,XML Schema 似乎無論哪個方面都比 DTD 強,不過 DTD 有一件事做的比 XML Schema 好。還記得實體麼?這些類似宏的聲明可以置換文檔中的命名項。在 DTD 中很容易定義實體。但是這種功能很難在 XML Schema 在中再現出來。一般實體常見於敘述性文法,在這個領域 DTD 的地位仍然很穩固。

  XML Schema 是 XML 的另一種應用。事實上,它也受到自己的 XML Schema 的約束。DTD 不是 XML,而是一種獨立的標記語言。有人認為這是 DTD 的缺點。其他人則認為 XML Schema 太羅嗦,很難閱讀。您已經看到將模式規范化成不同的部分可以在一定程度上減輕這種感覺。與 DTD 相比,模式更難從頭編寫。現代化工具在輸入的時候能夠提供提示性的幫助,在一定程度上緩解了這個問題。

  “一定要使用模式” 這種說法是不對的。最終必須根據具體的應用來作出選擇,這裡給出兩方面的一些意見供您參考。

  總結

  本系列的第 1 部分討論了 XML 體系結構。這是第二篇教程,討論了數據文檔和敘述性文檔的特點。然後對一個簡單的案例研究用 XML 建模,說明了文法的迭代過程。第 3 部分將介紹如何在應用程序中處理 XML。第 4 部分的重點是如何將 XML 文檔轉換成新文檔,第 5 部分介紹測試和優化 XML 以及常見的相關技術。

  學習完本系列教程後,您將具備足夠的背景知識來幫助您准備 IBM 認證考試 142 “XML 及相關技術”,以通過 IBM CertifIEd Solution Developer —— XML and Related TechnologIEs 認證。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved