跳轉到內容

XML - 資料交換管理/單一實體

來自華夏公益教科書



上一章 下一章
XML 簡介 基本資料結構




學習目標


  • 介紹 XML 文件、模式和樣式表
  • 描述和建立 XML 文件
  • 描述和建立 XML 模式
  • 描述和建立 XML 樣式表


在本章中,我們將開始使用 XML 文件、模式和樣式表來練習使用 XML。XML 文件以結構化的分層格式組織資料和資訊。XML 模式為給定 XML 文件的結構提供標準和規則。XML 模式還支援資料傳輸。XSL (XML 樣式表) 允許對 XML 文件中的內容進行獨特呈現。

在第一章“XML 簡介”中,您瞭解了 XML 是什麼、為什麼它有用以及如何使用它。因此,現在您想建立您自己的 XML 文件。在本章中,我們將向您展示用於建立 XML 文件的基本元件。本章是所有後續章節的基礎--它有點長,但不要害怕。我們將帶您瞭解 XML 文件的基礎知識。


本章分為三個部分

  • XML 文件
  • XML 模式
  • XML 樣式表 (XSL)


正如您在上一章中瞭解到的,XML 模式和樣式表本質上是專門的 XML 文件。在這三個部分中,我們將檢查建立文件所需的佈局和元件。在 XML 文件、模式和樣式表部分的末尾,有一些連結向您展示如何使用 XML 編輯器來建立文件。在頁面底部,有一個連結指向本章的練習和答案。

在開始建立 XML 文件之前,您需要的第一件事是一個問題--您想透過使用 XML 來儲存和共享資料或資訊來解決的問題。您需要一些實體,您可以收集有關該實體的資訊,然後以各種格式訪問這些資訊。因此,我們為您建立了一個。

要開發 XML 文件和模式,請從一個數據模型開始,該模型描述實際交換資料的真實情況。建立了高保真模型後,資料模型可以輕鬆地轉換為 XML 文件和模式。在本章中,我們從一個非常簡單的情況開始,並在後續章節中擴充套件複雜性,以教您更多有關 XML 的功能。

我們的起點是一個單一實體 CITY,如以下圖所示。雖然我們的重點是這個單一實體,但要將 CITY 對映到 XML 模式,我們需要有一個包含 CITY 的實體。在這種情況下,我們建立了 TOURGUIDE。將 TOURGUIDE 視為包含許多城市,在本例中,TOURGUIDE 沒有屬性或識別符號。它只是城市資料的容器。


圖 1:資料模型 - 旅遊指南


XML 文件

[編輯 | 編輯原始碼]

XML 文件是一個包含 XML 程式碼和語法的檔案。XML 文件具有 .xml 副檔名。

我們將檢查 XML 文件的功能和元件。


  • 序言 (XML 宣告)
  • 元素
  • 屬性
  • 遵循的規則
  • 格式良好且有效的 XML 文件


下面是一個使用我們的旅遊指南模型的示例 XML 文件。在描述 XML 文件的部分時,我們將參考它。

圖 2:城市實體的 XML 文件

  <?xml version="1.0" encoding="UTF-8"?>
  <tourGuide xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
    xsi:noNamespaceSchemaLocation='city.xsd'>
    <city>
        <cityName>Belmopan</cityName>
        <adminUnit>Cayo</adminUnit>
        <country>Belize</country>
        <population>11100</population>
        <area>5</area>
        <elevation>130</elevation>
        <longitude>88.44</longitude>
        <latitude>17.27</latitude>
        <description>Belmopan is the capital of Belize</description>
        <history>Belmopan was established following the devastation of the
           former capital, Belize City, by Hurricane Hattie in 1965. High 
           ground and open space influenced the choice and ground-breaking 
           began in 1966.  By 1970 most government offices and operations had 
           already moved to the new location.
        </history>
    </city>
    <city>
        <cityName>Kuala Lumpur</cityName>
        <adminUnit>Selangor</adminUnit>
        <country>Malaysia</country>
        <population>1448600</population>
        <area>243</area>
        <elevation>111</elevation>
        <longitude>101.71</longitude>
        <latitude>3.16</latitude>
        <description>Kuala Lumpur is the capital of Malaysia and the largest 
            city in the nation</description>
        <history>The city was founded in 1857 by Chinese tin miners and  
            preceded Klang.  In 1880 the British government transferred their 
            headquarters from Klang to Kuala Lumpur, and in 1896 it became the 
            capital of Malaysia. 
        </history>
    </city>
    <city>
        <cityName>Winnipeg</cityName>
        <adminUnit>St. Boniface</adminUnit>
        <country>Canada</country>
        <population>618512</population>
        <area>124</area>
        <elevation>40</elevation>
        <longitude>97.14</longitude>
        <latitude>49.54</latitude>
        <description>Winnipeg has two seasons. Winter and Construction.</description>
        <history>The city was founded by people at the forks (Fort Garry)
         trading in pelts with the Hudson Bay Company. Ironically, 
         The Bay was bought by America.
        </history>
    </city>
  </tourGuide>

序言 (XML 宣告)

[編輯 | 編輯原始碼]

XML 文件從序言開始。序言告知讀者和計算機某些規範,這些規範使文件符合 XML 標準。第一行是 XML 宣告(也是此基本 XML 文件中唯一的行)。

圖 3:XML 文件 - 序言

     <?xml version="1.0" encoding="UTF-8"?>

xml   =   這是一個 XML 文件
version="1.0"   =   XML 版本(XML 1.0 是 W3C 推薦的版本)
encoding="UTF-8"   =   文件中使用的字元編碼 - UTF 8 對應於 8 位編碼的 Unicode 字元(即編碼國際文件的標準方式) - Unicode 為每個字元提供一個唯一編號。
XML 宣告的另一個潛在屬性
standalone="yes"   =   文件的依賴性('yes' 表示文件不需要另一個文件來完成內容)

您在 XML 文件中看到的大部分內容都由 XML 元素組成。元素透過它們的標籤識別,這些標籤以 < 或 </ 開頭,以 > 或 /> 結尾。開始標籤看起來像這樣:<element attribute="value">,左邊是左尖括號 (<),後面是元素型別名稱、可選屬性,最後是右尖括號 (>)。結束標籤看起來像這樣:</element>,類似於開始標籤,但左尖括號和元素型別名稱之間有一個斜槓 (/),並且沒有屬性。

當開始標籤和結束標籤之間沒有任何內容時,XML 允許您將它們組合成一個空元素標籤,該標籤可以包含開始標籤可以包含的所有內容:<img src="Belize.gif" />。此標籤必須以斜槓和右尖括號 (/>) 結尾,以便將其與開始標籤區分開來。

XML 文件圍繞一個主要主題設計,一個涵蓋所有其他專案和主題的總括概念;分析此主題以確定其組成部分,建立類別和子類別。主要主題及其組成部分由元素描述。在我們的示例 XML 文件中,'tourGuide' 是主要主題;'city' 是一個類別;'population' 是 'city' 的一個子類別;層次結構可以進一步擴充套件:'males' 和 'females' 可以是 'population' 的子類別。元素遵循將在“遵循的規則”部分中描述的幾個語法規則。


我們在 <tourGuide> 開始標籤中省略了屬性 - 這將在 XML 模式部分進行解釋。

圖 4:城市實體 XML 文件的元素

  <tourGuide>
    <city>
        <cityName>Belmopan</cityName>
        <adminUnit>Cayo</adminUnit>
        <country>Belize</country>
        <population>11100</population>
        <area>5</area>
        <elevation>130</elevation>
        <longitude>88.44</longitude>
        <latitude>17.27</latitude>
        <description>Belmopan is the capital of Belize</description>
        <history>Belmopan was established following the devastation of the
           former capital, Belize City, by Hurricane Hattie in 1965. High 
           ground and open space influenced the choice and ground-breaking 
           began in 1966.  By 1970 most government offices and operations had 
           already moved to the new location.
        </history>
    </city>
  </tourGuide>


元素層次結構

[編輯 | 編輯原始碼]
  • 根元素  -   這是 XML 文件的主要主題元素。每個文件必須且只能有一個根元素。所有其他元素都包含在此根元素內。根元素位於 XML 宣告之後。
  • 父元素  -   這是包含其他元素(子元素)的任何元素。在我們的示例中,<city> 是一個父元素。
  • 子元素  -   這是包含在另一個元素(父元素)內的任何元素。在我們的示例中,<population> 是 <city> 的一個子元素。
  • 同級元素  -   這些是共享相同父元素的元素。在我們的示例中,<cityName>、<adminUnit>、<country>、<population>、<area>、<elevation>、<longitude>、<latitude>、<description> 和 <history> 都是同級元素。


屬性透過提供附加或必需的資訊來幫助修改給定元素的內容。它們包含在元素的開始標籤內。在我們的示例 XML 文件程式碼中,我們可以利用屬性來指定用於確定面積和海拔的度量單位(可以是英尺、碼、米、公里等);在這種情況下,我們可以將屬性命名為“measureUnit”並在“area”和“elevation”的開始標籤內定義它。


       <adminUnit class="state">Cayo</adminUnit>
       <adminUnit class="region">Selangor</adminUnit>


上述屬性示例也可以寫成


1. 使用子元素

     <adminUnit>
          <class>state</class>
          <name>Cayo</name>
     </adminUnit>
     <adminUnit>
          <class>region</class>
          <name>Selangor</name>
     </adminUnit>

2. 使用空元素

    <adminUnit class="state" name="Cayo" />
    <adminUnit class="region" name="Selangor" />


屬性可以用於

  • 提供未在資料中定義的更多資訊
  • 定義元素的特徵(大小、顏色、樣式)
  • 確保在所有例項中包含有關元素的資訊

但是,屬性可能更難操作,並且有一些限制。如果您需要更多自由度,請考慮使用子元素。


遵循的規則

[編輯 | 編輯原始碼]

這些規則旨在幫助計算機讀取您的 XML 文件。

  • XML 文件的第一行必須是 XML 宣告(序言)。
  • XML 文件的主要主題是在根元素中建立的,所有其他元素都必須包含在此根元素的開始和結束標籤內。
  • 每個元素都必須有一個開始標籤和一個結束標籤 - 沒有例外

(例如 <element>data stuff</element>)。

  • 標籤必須以特定的順序巢狀

=> 父元素的開始和結束標籤必須包含其所有子元素的標籤;這樣,您首先關閉最後開啟的標籤

<parentElement>
      <childElement1>data</childElement1>
      <childElement2>
              <subChildElementA>data</subChildElementA>
              <subChildElementB>data</subChildElementB>
      </childElement2>
      <childElement3>data</childElement3>
</parentElement>
  • 屬性值應在其周圍有引號,並且沒有空格。
  • 空標籤或空元素必須在標籤末尾有一個空格和一個斜槓(/)。
  • XML 語言中的註釋以“<!--”開頭,以“-->”結尾。


XML 元素命名約定

[編輯 | 編輯原始碼]

可以使用任何名稱,但想法是使名稱對可能閱讀文件的人有意義。

  • XML 元素只能以字母或下劃線字元開頭。
  • 名稱不能以字串“xml”開頭,該字串為 XML 規範保留。
  • 名稱不能包含空格。
  • “:”不應在元素名稱中使用,因為它被保留用於名稱空間(這將在後面的章節中詳細介紹)。
  • 名稱可以包含字母、數字或其他字元的混合。


XML 文件通常具有相應的資料庫。資料庫將包含與 XML 文件中的元素相對應的欄位。一個好習慣是將資料庫的命名規則用於 XML 文件中的元素。

DTD(文件型別定義)驗證 - 簡單示例

[編輯 | 編輯原始碼]
簡單內部 DTD
[編輯 | 編輯原始碼]
 <?xml version="1.0"?>
 <!DOCTYPE cdCollection [
    <!ELEMENT cdCollection (cd)>
    <!ELEMENT cd (title, artist, year)>
    <!ELEMENT title (#PCDATA)>
    <!ELEMENT artist (#PCDATA)>
    <!ELEMENT year (#PCDATA)>
 ]>
 <cdCollection>
  <cd>
    <title>Dark Side of the Moon</title>
    <artist>Pink Floyd</artist>
    <year>1973</year>
  </cd>
 </cdCollection>

將使用的每個元素都必須包含在 DTD 中。不要忘記包含根元素,即使您已經在 DTD 的開頭指定了它。您必須在 <!ELEMENT> 標籤中再次指定它。<!ELEMENT cdCollection (cd)> 根元素 <cdCollection> 包含文件中的所有其他元素,但只有一個直接子元素:<cd>。因此,您需要在括號中指定子元素(只需要指定直接子元素)。<!ELEMENT cd (title, artist, year)> 使用此行,我們定義 <cd> 元素。請注意,此元素包含子元素 <title>、<artist> 和 <year>。這些元素按特定順序拼寫出來。建立 XML 文件時必須遵循此順序。如果更改元素的順序(使用此特定 DTD),文件將無法驗證。<!ELEMENT title (#PCDATA)> 剩下的三個標籤 <title>、<artist> 和 <year> 實際上不包含其他標籤。但是,它們確實包含一些需要解析的文字。您可能還記得在之前的講座中,此資料稱為解析字元資料或 #PCDATA。因此,#PCDATA 在括號中指定。因此,此簡單的 DTD 概述了您在此 XML 檔案中看到的全部內容。只要我們堅持使用此 DTD,就無法新增或刪除任何內容。您可以更改的唯一內容是標籤之間的 #PCDATA 文字部分。

增加複雜性
[編輯 | 編輯原始碼]

有時您可能希望在特定元素中放入的不僅僅是字元資料,或者不僅僅是子元素。這稱為混合內容。例如,假設您希望能夠將字元資料或子元素(例如 <b> 標籤)放入 <description> 元素中

 <!ELEMENT description (#PCDATA | b | i )*>

這種特定安排允許我們同時使用 PCDATA、<b> 標籤或 <i> 標籤。但有一點需要注意的是,如果您要混合 PCDATA 和其他元素,則分組必須以星號 (*) 字尾結尾。此宣告允許我們在 XML 文件中新增以下內容(當然是在定義各個元素之後)

  <cd>
    <title>Love. Angel. Music. Baby</title>
    <artist>Gwen Stefani</artist>
    <year>2004</year>
    <genre>pop</genre>
    <description>
      This is a great album from former  
      <nowiki><i>No Doubt</i> singer <b>Gwen Stephani</b>.</nowiki>
    </description>
  </cd>

對於屬性,這與元素略有不同。請參見以下示例

  <cd remaster_date=”1992”>
    <title>Dark Side of the Moon</title>
    <artist>Pink Floyd</artist>
    <year>1973</year>
  </cd>

為了驗證,它必須在 DTD 中指定。屬性內容模型使用以下方法指定

 <!ATTLIST element_name attribute_name attribute_type default_value>

讓我們使用它來驗證我們的 CD 示例

 <!ATTLIST cd remaster_date CDATA #IMPLIED>
 <ATTLIST person gender (male|female) “male”>
為元素分組屬性
[編輯 | 編輯原始碼]

如果特定元素要具有許多不同的屬性,請將它們像這樣分組

<!ATTLIST car horn CDATA #REQUIRED
             seats CDATA #REQUIRED
     steeringwheel CDATA #REQUIRED
             price CDATA #IMPLIED>
新增靜態驗證,用於必須具有特定值的專案
[編輯 | 編輯原始碼]
<!ATTLIST classList   classNumber CDATA #IMPLIED
                      building (UWINNIPEG_DCE|UWINNIPEG_MAIN) "UWINNIPEG_MAIN"
                      originalDeveloper CDATA #FIXED "Khal Shariff">

那麼,當我們想要新增更多 CD 時,我們最後的 CD 集合示例會發生什麼?使用當前的 DTD,我們無法新增更多 CD 而不出現錯誤。嘗試一下,看看結果。當您按我們之前的方式指定子元素(或元素)時,只能使用每個子元素的一個。對於 CD 集合來說這不太適合吧?我們可以使用稱為字尾的東西來為 <!ELEMENT> 標籤新增功能。字尾新增到指定子元素的末尾。可以使用 3 個主要字尾

  • (沒有後綴):只能使用 1 個子元素。
  • (+):可以使用一個或多個元素。
  • (*):可以使用零個或多個元素。
  • ( ? ): 可以使用零個或一個元素。
使用 DTD 驗證多個子元素
[編輯 | 編輯原始碼]

因此,在我們的 CD 合集 XML 檔案中,我們可以透過新增 + 字尾來新增更多 CD 到列表中。

<!ELEMENT cd_collection(cd+)>
使用更多內部格式化標籤
[編輯 | 編輯原始碼]

例如,粗體標籤 B 在 DTD 中也被定義為元素,它們是可選的,如下所示

<ELEMENT notes (#PCDATA | b | i)*>
   <!ELEMENT b (#PCDATA)*>
   <!ELEMENT i (#PCDATA)*>
]>

_______________

<classList classNumber="303" building="UWINNIPEG_DCE" originalDeveloper="Khal Shariff">
 <student>
   <firstName>Kenneth
   </firstName>
   <lastName>Branaugh
   </lastName>
   <studentNumber>
   </studentNumber>
   <notes><b>Excellent </b>, Kenneth is doing well.
   </notes>
etc

BMEcat 案例研究

[編輯 | 編輯原始碼]

最早將 XML 作為 B2B 交換格式的重大國家專案之一是由德國聯邦物料管理、採購和物流協會 (BME) 與領先的德國公司(例如拜耳、寶馬、SAP 和西門子)合作發起的。他們共同建立了產品目錄交換標準。該專案被稱為 BMEcat。該計劃的結果是建立了用於描述產品目錄和相關交易(新目錄、產品資料更新和價格更新)的 DTD 集。

在電子商務領域運營的公司(供應商、採購公司和市場)交換的資料量越來越大。由於資料交換格式的多樣性,他們很快就會達到極限。BMEcat 解決方案為以簡潔明瞭的方式從各種資料格式傳輸目錄資料創造了基礎。這為推動德國透過網際網路進行貨物流通奠定了基礎。使用 BMEcat 可以降低所有方的成本,因為可以使用標準介面。

基於 XML 的標準 BMEcat 已成功在許多專案中實施。如今,各種公司都在應用 BMEcat,並使用它在這個已建立的標準中交換他們的產品目錄。


BMEcat 目錄(版本 1.2)由以下主要元素組成:

CATALOG 此元素包含購物目錄的基本資訊,例如語言版本和有效期。BMEcat 要求每個目錄中只有一門語言。

SUPPLIER 此元素包含目錄供應商的標識和地址。BMEcat 要求每個目錄中只有一家供應商。

BUYER 此元素包含目錄接收方的姓名和地址。BMEcat 要求每個目錄中最多有一個接收方。

AGREEMENT 此元素包含一個或多個與相應有效期相關的框架協議 ID。BMEcat 要求所有屬於上述合同的目錄價格。

CLASSIFICATION SYSTEM 此元素允許完整傳輸一個或多個分類系統,包括特徵定義和關鍵詞。

CATALOG GROUP SYSTEM 此元素源於版本 1.0。它主要用於傳輸樹狀結構,方便使用者在目標系統(瀏覽器)中導航。

ARTICLE(自 2005 年起 PRODUCT) 此元素表示一個產品。它包含一組標準屬性。

ARTICLE PRICE(自 2005 年起 PRODUCT PRICE) 此元素表示一個價格。與其他交換格式相比,對不同定價模型的支援非常強大。季節價格、國家價格、不同貨幣和不同有效期等都將得到支援。

ARTICLE FEATURE(自 2005 年起 PRODUCT FEATURE) 此元素允許傳輸特徵值。您可以記錄預定義的組特徵或單個產品特徵。

VARIANT 此元素允許列出產品變體,無需重複。但是,BMEcat 的變體僅適用於值的變化,導致文章 ID 發生變化。否則,任何其他屬性(尤其是價格)都不能存在依賴關係。

MIME 此元素包含任意數量的附加文件,例如產品圖片、資料表或網站。

ARTICLE REFERENCE(自 2005 年起 REFERENCE PRODUCT) 此元素允許在目錄內以及目錄之間進行交叉引用。這些引用可能僅用於對映產品捆綁包。

USER DEFINED EXTENSION 此元素支援傳輸超出 BMEcat 標準之外的資料。傳送方和接收方必須協調一致。

您可以在 這裡找到一個典型的 BMEcat 檔案。

線上驗證器
[編輯 | 編輯原始碼]

GIYBF

格式良好且有效的 XML

[編輯 | 編輯原始碼]

格式良好的 XML - 正確遵守 XML 語法規則的 XML 文件。

有效的 XML - 遵守 XML 模式規則(我們將在後面討論)的 XML 文件。要使 XML 文件有效,它首先必須是格式良好的。


有效的 XML 文件必須是格式良好的。但是,格式良好的 XML 文件可能無效 - 換句話說,符合 XML 語法標準的格式良好的 XML 文件可能不符合 XML 模式的標準,因此將無效。

例如,考慮以下情況,您的 XML 文件包含以下內容(對於此模式):

  <city>
    <cityName>Boston</cityName>
    <country>United States</country>
    <adminUnit>Massachusetts</adminUnit>
  :
  :
  :
  </city>

注意,元素沒有按照模式(cityName、adminUnit、country)的正確順序出現。可以使用 XML 驗證軟體針對其宣告的模式來驗證 XML 文件 - 驗證軟體將捕獲順序錯誤。


使用 XML 編輯器

[編輯 | 編輯原始碼]

檢視章節 XML 編輯器以獲取有關如何啟動 XML 編輯器的說明。完成啟動步驟後,可以將示例 XML 文件中的程式碼複製並貼上到 XML 編輯器中。然後檢查結果。XML 文件是否格式良好?XML 文件是否有效?(您需要複製並貼上模式才能進行驗證 - 我們將在下一節介紹模式)


XML 模式

[編輯 | 編輯原始碼]

XML 模式是一個 XML 文件。XML 模式具有 .xsd 副檔名。

XML 模式用於透過提供 XML 文件遵循的模板來控制 XML 文件的結構和內容,以使其有效。它是關於如何構建 XML 文件以及指示 XML 文件元件(元素和屬性 - 及其關係)的指南。XML 編輯器將檢查 XML 文件以確保它符合其針對其編寫的 XML 模式的規範 - 以確保它有效。

XML 模式增強了對資料傳輸的信心。有了模式,資料接收方可以確信資料符合預期。傳送方和接收方對資料表示的含義有共同的理解。

因為 XML 模式是一個 XML 文件,所以您使用相同的語言 - 標準 XML 標記語法 - 其中包含特定於模式的元素和屬性。


模式定義

  • 文件的結構
  • 元素
  • 屬性
  • 子元素
  • 子元素的數量
  • 元素的順序
  • 所有元素的名稱和內容
  • 每個元素的資料型別

有關 XML 模式和以下參考列表的更多詳細資訊:常見 XML 模式基本資料型別、XML 模式元素摘要、資料型別模式限制和方面以及例項文件屬性,請點選此維基百科連結 => https://wikibook.tw/wiki/XML_Schema


模式引用

[編輯 | 編輯原始碼]

這是 XML 文件中引用 XML 模式的部分。

圖例 5:XML 文件的模式引用

  <tourGuide
      xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
      xsi:noNamespaceSchemaLocation='city.xsd'>

這是我們在上一節中描述基本 XML 文件中的根元素時遺漏的部分。根元素 <tourGuide> 的附加屬性引用了 XML 模式(它是 schemaLocation 屬性)。

xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'  -  引用 W3C 模式例項名稱空間
xsi:noNamespaceSchemaLocation='city.xsd'  -  引用 XML 模式文件 (city.xsd)

模式文件

[編輯 | 編輯原始碼]

以下是一個使用我們的 TourGuide 模型的示例 XML 模式。在描述 XML 模式部分時,我們將參考它。

圖例 6:城市實體的 XML 模式文件

  <?xml version="1.0" encoding="UTF-8"?>
  <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   elementFormDefault="unqualified">  
    <xsd:element name="tourGuide">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="city" type="cityDetails" minOccurs = "1" maxOccurs="unbounded" />
            </xsd:sequence>
        </xsd:complexType>
     </xsd:element>
     <xsd:complexType name="cityDetails">
        <xsd:sequence> 
             <xsd:element name="cityName" type="xsd:string"/>
             <xsd:element name="adminUnit" type="xsd:string"/>
             <xsd:element name="country" type="xsd:string"/>
             <xsd:element name="population" type="xsd:integer"/>
             <xsd:element name="area" type="xsd:integer"/>
             <xsd:element name="elevation" type="xsd:integer"/>
             <xsd:element name="longitude" type="xsd:decimal"/>
             <xsd:element name="latitude" type="xsd:decimal"/>
             <xsd:element name="description" type="xsd:string"/>
             <xsd:element name="history" type="xsd:string"/>
         </xsd:sequence>
     </xsd:complexType>
  </xsd:schema>
  <!--
    Note: Latitude and Longitude are decimal data types.
    The conversion is from the usual form (e.g., 50º 17' 35")
    to a decimal by using the formula degrees+min/60+secs/3600.
  -->


請記住,XML 模式本質上是一個 XML 文件,因此必須以序言開頭,在模式的情況下,序言包括

  • XML 宣告
  • 模式元素宣告


XML 宣告

  <?xml version="1.0" encoding="UTF-8"?>

模式元素宣告

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">

模式元素類似於根元素 - 它包含模式中的所有其他元素。

架構元素的屬性包括

xmlns  -  XML 名稱空間 - 描述架構中使用的 XML 元素和資料型別的網站的 URL。

您可以在此處找到有關名稱空間的更多資訊 => 名稱空間

xmlns:xsd  -  所有帶有“xsd”字首的元素和屬性都遵循給定名稱空間中指定的詞彙表。

elementFormDefault  -  目標名稱空間中的元素要麼需要,要麼不需要用名稱空間字首限定。這在引用多個名稱空間時最有用。在這種情況下,'elementFormDefault' 必須是 qualified,因為您必須指示每個元素使用哪個名稱空間。如果您只引用一個名稱空間,則 'elementFormDefault' 可以是 unqualified。也許,使用 qualified 作為預設值是最明智的,這樣您就不會意外地忘記指示您正在引用的名稱空間。

元素宣告

[編輯 | 編輯原始碼]

定義架構中的元素。

包括

  • 元素名稱
  • 元素資料型別(可選)

基本元素宣告格式:<xsd:element name="name" type="type">

簡單型別
[編輯 | 編輯原始碼]

宣告元素,這些元素

  • 不包含子元素
  • 不包含屬性

例如:<xsd:element name="cityName" type="xsd:string" />

預設值

如果元素沒有分配值,則分配預設值。

例如:<xsd:element name="description" type="xsd:string" default="really cool place to visit!" />

固定值

定義為固定的屬性必須為空或包含指定的固定值。不允許其他值。

例如:<xsd:element name="description" type="xsd:string" '''fixed="you must visit this place - it is awesome!"''' />

複雜型別
[編輯 | 編輯原始碼]

宣告元素,這些元素

  • 可以包含子元素
  • 可以包含屬性

示例

1. 根元素 'tourGuide' 包含子元素 'city'。這裡顯示了它

無名複雜型別

     <xsd:element name="tourGuide">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="city" type="cityDetails" minOccurs = "1" maxOccurs="unbounded" />
            </xsd:sequence>
        </xsd:complexType>
     </xsd:element>

出現指示器:

  • minOccurs = 元素可以出現的最小次數(這裡是 1 次)
  • maxOccurs = 元素可以出現的最大次數(這裡是不限次數,'unbounded')


2. 父元素 'city' 包含許多子元素:'cityName'、'adminUnit'、'country'、'population' 等。為什麼這個複雜的元素集不以以下行開頭:<xsd:element name="city" type="cityDetails">?元素 'city' 已經在上面的複雜元素 'tourGuide' 中定義,並且被賦予了型別 'cityDetails'。此資料型別 'cityDetails' 在此處用於識別父元素 'city' 的子元素序列。

命名複雜型別 - 因此可以在架構的其他部分重複使用

   <xsd:complexType name="cityDetails">
        <xsd:sequence>
             <xsd:element name="cityName" type="xsd:string"/>
             <xsd:element name="adminUnit" type="xsd:string"/>
             <xsd:element name="country" type="xsd:string"/>
             <xsd:element name="population" type="xsd:integer"/>
             <xsd:element name="area" type="xsd:integer"/>
             <xsd:element name="elevation" type="xsd:integer"/>
             <xsd:element name="longitude" type="xsd:decimal"/>
             <xsd:element name="latitude" type="xsd:decimal"/>
             <xsd:element name="description" type="xsd:string"/>
             <xsd:element name="history" type="xsd:string"/>
         </xsd:sequence>
   </xsd:complexType>

<xsd:sequence> 標籤表示子元素必須按照此處指定的順序出現。

比較示例 XML 架構和示例 XML 文件 - 嘗試觀察程式碼中的模式以及 XML 架構如何設定 XML 文件。


3. 具有屬性的元素也被指定為複雜型別。

a. 此 XML 文件行:<adminUnit class="state" name="Cayo" /> 將在 XML 架構中定義為

     <xsd:element name="adminUnit">
          <xsd:complexType>
               <xsd:attribute name="class" type="xsd:string" />
               <xsd:attribute name="name" type="xsd:string" />
          </xsd:complexType>
     </xsd:element>

b. 此 XML 文件行:<adminUnit class="state">Cayo</adminUnit> 將在 XML 架構中定義為

     <xsd:element name="adminUnit">
          <xsd:complexType>
               <xsd:simpleContent>
             		<xsd:extension base="xsd:string">
                                <xsd:attribute name="class" type="xsd:string" />
                        </xsd:extension>
	       </xsd:simpleContent>
          </xsd:complexType>
     </xsd:element>

屬性宣告

[編輯 | 編輯原始碼]

屬性宣告用於複雜型別定義。我們在複雜型別元素的第三個示例中看到了一些屬性宣告。

<xsd:attribute name="class" type="xsd:string" />


資料型別宣告

[編輯 | 編輯原始碼]

這些包含在元素和屬性宣告中,如下所示: type=" "

常見 XML 架構資料型別

XML 架構具有許多內建資料型別。最常見的型別是

string 一個字元字串
decimal 一個小數
integer 一個整數
boolean 值 true 或 false 或 1 或 0
date 一個日期,可以指定日期模式,例如 YYYY-MM-DD
time 一天中的時間,可以指定時間模式,例如 HH:MM:SS
dateTime 日期和時間組合
anyURI 如果元素將包含 URL


有關內建簡單資料型別的完整列表,請參閱 http://www.w3.org/TR/xmlschema-2/#built-in-datatypes



使用 XML 編輯器 => XML 編輯器

此連結將帶您瞭解如何啟動 XML 編輯器。按照入門步驟操作後,您可以複製示例 XML 架構文件中的程式碼,並將其貼上到 XML 編輯器中。然後檢查您的結果。XML 架構是否格式正確?XML 架構是否有效?


XML 樣式表(XSL)

[編輯 | 編輯原始碼]

XML 樣式表是一個 XML 文件。XML 樣式表具有 .xsl 副檔名。

可擴充套件樣式表語言 (XSL) 提供了一種方法來轉換和格式化 XML 文件的內容以供顯示。由於 XML 文件不包含瀏覽器理解的標籤,例如 HTML 標籤,因此瀏覽器在沒有包含表示資訊樣式表的情況下無法呈現資料。透過將資料和表示邏輯分開,XSL 允許人們根據自己的不同需求和偏好檢視資料。

XSL 轉換語言 (XSLT) 用於將 XML 文件從一種形式轉換為另一種形式,例如建立要在瀏覽器中檢視的 HTML 文件。XSLT 樣式表包含一組格式化指令,這些指令指示如何將 XML 文件的內容在瀏覽器中顯示,其效果與級聯樣式表 (CSS) 對 HTML 的效果類似。可以使用不同的樣式表建立相同資料的多個檢視。樣式表的輸出不受限於瀏覽器。


在轉換過程中,XSLT 會分析 XML 文件並將其轉換為節點樹 - 整個 XML 文件的層次表示。每個節點代表 XML 文件的一部分,例如元素、屬性或一些文字內容。XSL 樣式表包含預定義的“模板”,其中包含有關如何處理節點的指令。XSLT 將使用 match 屬性將 XML 元素節點與模板相關聯,並將它們轉換為結果文件。

圖 7:城市實體的 XML 樣式表文檔

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/> 
    <xsl:template match="/">
        <html>
            <head>
                <title>Tour Guide</title>
            </head>
            <body>
                <h2>Cities</h2>
                <xsl:apply-templates select="tourGuide"/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="tourGuide">
        <xsl:for-each select="city">
            <br/><xsl:value-of select="continentName"/><br/>
            <xsl:value-of select="cityName"/><br/>
            <xsl:text>Population: </xsl:text>
            <xsl:value-of select='format-number(population, "##,###,###")'/><br/>
            <xsl:value-of select="country"/>
            <br/>
        </xsl:for-each>     
    </xsl:template>
</xsl:stylesheet>


表 2-3 中 city.xsl 樣式表的輸出將如下所示

城市

歐洲
馬德里
人口:3,128,600
西班牙

亞洲
上海
人口:18,880,000

中國


您會注意到樣式表包含 HTML,用於通知媒體工具(網路瀏覽器)表示設計。如果您不瞭解 HTML,這可能看起來有點令人困惑。W3Schools 教程等線上資源可以幫助您瞭解您需要的基本知識 =>(https://w3schools.tw/html/default.asp)。

HTML 中包含了 XML,它提供了我們 XML 文件中包含的資料資訊。樣式表的 XML 指示將顯示哪些資訊以及如何顯示。因此,HTML 建立一個顯示,而 XML 在該顯示中插入值。XSL 是將資訊轉換為表示形式的工具,但同時保留資料的含義。

伯樂曼的 XML 案例研究

德國伯樂曼公司是一傢俬營的媒體集團,業務遍及 56 個國家,涉及電視廣播(RTL)、雜誌(Gruner & Jahr)、書籍(蘭登書屋)等領域。2005 年,其 89,000 名員工創造了 180 億歐元的收入。

如此多元化的業務面臨的一個主要問題是利用協同效應。管理層需要確保蘭登書屋的員工不會浪費時間和金錢去重新發明 RTL 電視記者已經創造的東西。

因此,基於 IT 的知識管理承諾帶來巨大的時間節省。因此,伯樂曼於 2002 年啟動了一個名為 BeCom 的專案。BeCom 的目的是讓不同的伯樂曼業務部門能夠使用相同的資料來進行不同的媒體應用。XML 在這個專案中至關重要,因為它允許將資料(文件)與呈現(樣式表)分離。因此,資料既可以進行統計分析,也可以修改以適應電視和報紙等不同的媒體。

例如,基於 XML 的統計資料管理使員工能夠從 CBR(基於案例的推理)中受益。CBR 允許伯樂曼員工在搜尋特定內容時從其他伯樂曼員工的先前搜尋結果中獲益,從而獲得比孤立的研究結果更具語境的的資訊。除了 XML 資料管理之外,伯樂曼的電視和圖書部門還可以使用各種佈局應用程式(如 3B2 或 QuarkXPress)在他們的特定媒體中應用這些最佳化後的資料。


序言

[edit | edit source]
  • XML 宣告;
  • 樣式表宣告;
  • 名稱空間宣告;
  • 輸出文件格式。
 <?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html"/>


XML 宣告

 <?xml version="1.0" encoding="UTF-8"?>


樣式表和名稱空間宣告

     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  • 標識文件為 XSL 樣式表;
  • 標識版本號;
  • 引用 W3C XSL 名稱空間 - 描述架構中使用的 XML 元素和資料型別的網站的 URL。您可以在此處找到有關名稱空間的更多資訊 => Namespace。每次使用 xsl: 字首時,它都會引用給定的名稱空間。


輸出文件格式

      <xsl:output method="html"/>

此元素指定輸出文件的格式,並且必須是 <xsl:stylesheet> 的子元素。

模板

[edit | edit source]

<xsl:template> 元素用於建立描述如何顯示元素及其內容的模板。上面,在 XSL 簡介中,我們提到 XSL 將 XML 文件分解成節點並在單個節點上工作。這是透過模板完成的。XSL 中的每個模板都描述一個節點。要確定給定模板描述的節點,請使用“match”屬性。賦予“match”屬性的值稱為模式。請記住:(節點樹 - 整個 XML 文件的分層表示。每個節點表示 XML 文件的一部分,例如元素、屬性或某些文字內容)。在節點樹中出現分支的地方,都存在一個節點。<xsl:template> 定義了模板的開始,幷包含在匹配特定節點時要應用的規則。


match 屬性

   <xsl:template match="/">

此模板 match 屬性將 XML 文件根 (/,即 XML 源文件的整個分支) 與 HTML 文件根相關聯。此模板元素中包含在任何 HTML 文件開頭都會找到的典型 HTML 標記。這些 HTML 將寫入輸出。XSL 會查詢根匹配,然後輸出瀏覽器可以理解的 HTML。

   <xsl:template match="tourGuide">

此模板 match 屬性將元素“tourGuide”與該元素中描述的顯示規則相關聯。


元素

[edit | edit source]

特定於 XSL 的元素

XSL 元素 含義
(來自我們的示例 XSL)
<xsl:text> 列印在此元素標記之間找到的實際文字
<xsl:value-of> 此元素與“select”屬性一起使用,用於查詢所選節點的值並將其插入到輸出中。
<xsl:for-each> 此元素與“select”屬性一起使用,用於透過迴圈遍歷所選節點集中的所有節點來處理重複的元素。
<xsl:apply-templates> 此元素將對節點或節點應用模板。如果它使用“select”屬性,則該模板將僅應用於所選子節點,並且可以指定子節點的順序。如果未使用“select”屬性,則該模板將應用於當前節點及其所有子節點以及文字節點。

更多 XSL 元素 => https://w3schools.tw/xsl/xsl_w3celementref.asp

特定語言的驗證和轉換方法

[edit | edit source]

PHP XML Dom 驗證方法

[edit | edit source]

使用 DOM DocumentObjectModel 驗證 XML 以及 DTD DocumentTypeDeclaration 和伺服器上的 PHP 語言以及更多 http://wiki.cc/php/Dom_validation

瀏覽器方法

[edit | edit source]

將此程式碼行放在您的 .xml 文件中,位於 XML 宣告(序言)之後。

 <?xml-stylesheet type="text/xsl" href="tourGuide.xsl"?>

PHP XML 生產

[edit | edit source]
 <?php
 $xmlData = "";
 mysql_connect('localhost','root','')
 or die('Failed to connect to the DBMS');
 // make connection to database
 mysql_select_db('issd')
 or die('Failed to open the requested database');
 $result = mysql_query('SELECT * from students') or die('Query to like get the records failed');
 if (mysql_num_rows($result)<1){
    die ('');
 }
 $xmlString = "<classlist>\n";
 $xmlString .= "\t<student>";
 while ($row = mysql_fetch_array($result)) {
         $xmlString .=  "
          \t<firstName>
              ".$row['firstName']."
           </firstName>\n
            \t<lastName>
              ".$row['lastName']."
          \t</lastName>\n";         
      }
 $xmlString .= "</student>\n";
 $xmlString .= "</classlist>";
 echo $xmlString;
 $myFile = "classList.xml"; //any file
 $fh = fopen($myFile, 'w') or die("can't open file"); //create filehandler
 fwrite($fh, $xmlString); //write the data into the file
 fclose($fh); //ALL DONE!
 ?>

PHP XSLT 轉換方法

[edit | edit source]

此方法適用於 PHP5 和 wampserver(最新版本)。請確保在 php.ini 檔案中沒有註釋掉 *xsl*。

 <?php
 // Load the XML source
 $xml = new DOMDocument;
 $xml->load('tourguide.xml');
 $xsl = new DOMDocument;
 $xsl->load('tourguide.xsl');
 // Configure the transformer
 $proc = new XSLTProcessor;
 $proc->importStyleSheet($xsl); // attach the xsl rules
 echo $proc->transformToXML($xml);
 ?>


示例 1,在 PHP 本身中使用(使用 phpInfo() 函式檢查 XSLT 擴充套件;如果需要,請啟用)此示例可能會生成 XHTML。請注意,它可能會生成 XSL 定義的任何內容。

 <?php
 $xhtmlOutput = xslt_create();
 $args = array();
 $params = array('foo' => 'bar');
 $theResult = xslt_process(
                         $xhtmlOutput,
                         'theContentSource.xml',
                         'theTransformationSource.xsl',
                         null,
                         $args,
                         $params
                        );
 xslt_free($xhtmlOutput); // free that memory
 // echo theResult or save it to a file or continue processing (perhaps instructions)
 ?>

示例 2

 <?php
 if (PHP_VERSION >= 5) {
   // Emulate the old xslt library functions
   function xslt_create() {
       return new XsltProcessor();
   }
   function xslt_process($xsltproc,
                         $xml_arg,
                         $xsl_arg,
                          $xslcontainer = null,
                         $args = null,
                         $params = null) {
       // Start with preparing the arguments
       $xml_arg = str_replace('arg:', '', $xml_arg);
       $xsl_arg = str_replace('arg:', '', $xsl_arg);
       // Create instances of the DomDocument class
       $xml = new DomDocument;
       $xsl = new DomDocument;
       // Load the xml document and the xsl template
       $xml->loadXML($args[$xml_arg]);
       $xsl->loadXML($args[$xsl_arg]);
       // Load the xsl template
       $xsltproc->importStyleSheet($xsl);
       // Set parameters when defined
       if ($params) {
           foreach ($params as $param => $value) {
               $xsltproc->setParameter("", $param, $value);
           }
       }
       // Start the transformation
       $processed = $xsltproc->transformToXML($xml);
       // Put the result in a file when specified
       if ($xslcontainer) {
           return @file_put_contents($xslcontainer, $processed);
       } else {
           return $processed;
       }
   }
   function xslt_free($xsltproc) {
       unset($xsltproc);
   }
 }
 $arguments = array(
   '/_xml' => file_get_contents("xml_files/201945.xml"),
   '/_xsl' => file_get_contents("xml_files/convertToSql_new2.xsl")
 );
 $xsltproc = xslt_create();
 $html = xslt_process(
   $xsltproc,
   'arg:/_xml',
   'arg:/_xsl',
   null,
   $arguments
 );
 xslt_free($xsltproc);
 print $html;
 ?>

PHP 檔案寫入程式碼

[edit | edit source]
 $myFile = "testFile.xml"; //any file
 $fh = fopen($myFile, 'w') or die("can't open file"); //create filehandler
 $stringData = "<foo>\n\t<bar>\n\thello\n"; // get a string ready to write
 fwrite($fh, $stringData); //write the data into the file
 $stringData2 = "\t</bar>\n</foo>";
 fwrite($fh, $stringData2); //write more data into the file
 fclose($fh); //ALL DONE!

XML 顏色

[edit | edit source]

在您的樣式表中使用:這些顏色可用於背景和字型

https://w3schools.tw/html/html_colors.asp

https://w3schools.tw/html/html_colorsfull.asp

https://w3schools.tw/html/html_colornames.asp


使用 XML 編輯器 => XML 編輯器

此連結將帶您進入有關如何啟動 XML 編輯器的說明。按照啟動步驟操作後,您可以複製示例 XML 樣式表文檔中的程式碼並將其貼上到 XML 編輯器中。然後檢查您的結果。XML 樣式表是否格式正確?


托馬斯庫克的 XML 案例研究

[edit | edit source]

作為全球領先的旅遊公司和最廣為人知的品牌,托馬斯庫克在整個旅遊價值鏈中運營 - 包括航空公司、酒店、旅行社、旅遊和入境代理,為全球所有市場細分的客戶提供合適的產品。該集團擁有 11,000 多名員工,擁有 33 家旅行社,約 3,600 家旅行社,一支擁有 80 架飛機的機隊,員工人數約為 26,000 人。托馬斯庫克在歐洲和海外的 616 個地點運營。該公司現在是歐洲第二大旅遊集團,也是全球第三大旅遊集團。

由於 Thomas Cook 銷售其他公司的產品,範圍從打包假期到汽車租賃,因此需要定期更改其線上宣傳冊。在 Thomas Cook 開始使用 XML 之前,它將資訊以 HTML 格式儲存,並且需要長達六週的時間才能將線上宣傳冊上線。XML 有助於在三天內完成這項工作。這有助於為 Thomas Cook 的所有現有和潛在客戶及其分佈在不同地理位置的各個機構提供更新的資訊,而不是讓他們等待六週才能獲得新資訊。

XML 允許 Thomas Cook 將內容資訊儲存在單個數據庫中,該資料庫可以根據需要重複使用。Thomascook.com 的內容經理 Gwyn Williams 說:“我們不想一直重複相同的內容,我們希望能夠立即啟用它。”“這帶來了內部收益,例如能夠將員工重新部署到更有價值的領域。”Thomascook.com 目前以 XML 格式儲存了 65,000 頁的宣傳冊和旅行指南資訊以及線上雜誌。

Thomas Cook 在相對較早的階段就開始使用 XML。由於 Thomas Cook 擁有龐大的資料庫,因此早期使用 XML 將對其有利。在某個時候,資料庫將必須整合到 XML 中,據報道 XML 資料庫比傳統資料庫速度更快,這使 Thomas Cook 比不使用 XML 的公司具有一定的競爭優勢。

Thomas Cook 發現這可以帶來可觀的成本降低以及所有渠道資訊的一致性。透過實施中央內容管理系統來促進宣傳冊製作和網頁出版,他們已經將所有品牌和渠道的內容製作、維護和分發集中起來。

從上一章《XML 簡介》中,您瞭解了資料交換的必要性以及 XML 在資料交換中的用途。在本章中,您進一步瞭解了三種主要的 XML 檔案:XML 文件、XML 模式和 XML 樣式表。您學習了每種型別的檔案所需的正確文件。您學習了適用於所有 XML 文件的基本語法規則。您學習瞭如何整合三種類型的 XML 文件。並且您學習了“格式良好”文件和“有效”文件的定義和區別。透過點選“XML 編輯器”連結,您可以看到示例程式碼的結果,並學習如何使用 XML 編輯器。

下面是供進一步練習的習題和答案。祝您好運!


XML
SGML
Dan Connelly
RSS
XML Declaration
parent
child
sibling
element
attribute
*Well-formed XML
PCDATA

練習 1.

a)以上面的“tourguide”為例,建立一個根元素為“classlist”的 XML 文件。此 CLASSLIST 從單個實體 STUDENT 開始建立。任意數量的學生包含元素:firstname、lastname、emailaddress。

華夏公益教科書