XML 和 WebSphere Studio Application Developer — 第 6 部分: 使用 XML Schema 和 XML Editor 揭開 XML 名稱空間神祕的面紗

引言
IBM® WebSphere® Studio Application Developer是一種應用程序開發產品,它支持用 JSP、servlet、HTML、XML、Web 服務、數據庫和 EJB 等不同技術來構建多種應用程序。Application Developer 還特別提供了 XML 和關係數據之間的緊密集成。凡是 WebSphere Application Server 支持的數據庫,Application Developer 都支持,包括 DB2®、Oracle、Sybase 和 Microsoft® SQL Server™ 在內。

本文是一系列重點講述 WebSphere Studio Application Developer 附帶提供的多種 XML 工具的文章的第 6 部分。 第 1 部分展示瞭如何使用 Application Developer 開發 XML Schema; 第 2 部分演示瞭如何使用 Application Developer 的 SQL Builder 創建 SQL 查詢; 第 3 部分討論了 Application Developer 中可以用來在應用程序中集成數據訪問和 XML 的功能; 第 4 部分講述的是 XML Editor,一個用來創建和編輯 XML 文檔的可視化工具; 第 5 部分討論的則是如何使用 RDB to XML Mapping Editor 來創建 DB2 XML Extender 所用的 DAD 文件。

第 6 部分演示如何同時使用 XML Schema Editor 和 XML Editor 來開發使用 XML 名稱空間的 XML 應用程序。

爲什麼我們需要 XML 名稱空間
既然每個人都能夠創建自己在問題域中使用的 XML 元素和屬性,那我們就需要有一種辦法,能夠把具有相同名稱但來自於不同問題域的元素區別開來。舉例來說,PurchaseOrder(採購訂單)可能來自兩家不同的公司;在這種情況下,我們就可以使用 XML 名稱空間機制將兩者區別開來。

XML 名稱空間(XML Namespace)規範發佈於 1999 年年初,遠遠早於 XML Schema 規範。那時,因爲沒有一種用 DTD 構造名稱空間的標準方法,所以我們無法使用 DTD 來驗證對名稱空間敏感的 XML 文檔。在 2001 年 5 月引入了 XML Schema 之後這種情形得到了改變,因爲 XML Schema 支持名稱空間。諸如 Xerces2之類的驗證分析器(validating parser)可以按照 XML Schema 文檔的規定來驗證使用名稱空間的實例文檔。

通過示例解釋 XML 名稱空間
要解釋所有的名稱空間概念,最好的辦法是通過示例來說明。我們將通過一系列示例來仔細討論以下名稱空間主題。

您可以使用 XML Schema Editor 來創建或導入如下所示的 Course.xsd 模式文件。這個模式的目標名稱空間是 http://www.utoronto.ca 。這意味着在這個模式中定義的所有類型都屬於目標名稱空間 http://www.utoronto.ca ,而且您可以通過使用這個模式中的前綴 course 來引用這些類型。

清單 1. Course.xsd 文件

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

   targetNamespace="http://www.utoronto.ca" 

   xmlns:course="http://www.utoronto.ca">

   <element name="Schedule">

      <complexType>

         <sequence>

            <element name="course" type="course:CourseInfo"/>

            <element name="location" type="string"/>

         </sequence>

      </complexType>

   </element>

   <complexType name="CourseInfo">

      <sequence>

         <element name="courseId" type="string"/>

         <element name="description" type="string"/>

      </sequence>

   </complexType>

</schema>

無限定的本地元素
要創建一個與 Course.xsd 模式文件一致的實例文檔,請選擇 Course.xsd 文件,然後選擇 Generate =>XML File來啓動 Create XML File 嚮導。單擊 Next。在 Select Root Element 頁中,請選中 Create required and optional content選項,以創建一個帶有所需元素的 XML 文檔,如下面的圖 1 所示。請注意,在創建實例文檔時自動使用了目標名稱空間和 XML 模式文件的前綴。單擊 Finish 後就會自動創建 Course.xml 文件(請參看下面的清單 2)。

圖 1. 從 Course.xsd 生成 XML 文檔
Create XML File 的抓屏 — Select Root Element 嚮導

清單 2. Course.xml 文件 — 無限定的本地元素

<course:Schedule xmlns:course="http://www.utoronto.ca" 

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

   xsi:schemaLocation="http://www.utoronto.ca Course.xsd ">   

   <course>

      <courseId>courseId</courseId>

      <description>description</description>

   </course>

   <location>location</location>

</course:Schedule>

讓我們再來看看 Course.xml 文件。首先,根元素 Schedule 被限定(即 course:Schedule )爲屬於名稱空間 http://www.utoronto.ca 。這就使得我們可以把多倫多大學(University of Toronto)提供的課程(course)和其它大學提供的課程區別開來。其次,所有本地元素都是 無限定的。也就是說,諸如 coursecourseIddescriptionlocation 之類的本地元素都沒有前綴。這是因爲 Course.xsd 模式文件指定了本地元素不應被限定。您或許在想,對於編寫實例的人來說,要確定什麼需要限定以及什麼不需要限定可能會讓人很頭痛。下一部分就將告訴您,在一個實例文檔中如何使每個元素都是限定的。

限定的本地元素
要使 XML 實例文檔中的所有本地元素都得到限定,XML Schema 編寫者就必須在 schema 元素中把 elementFormDefault 屬性設置爲 qualified 。要完成這項工作,您只要將 Course.xsd 模式對象的 Design 視圖的 Element form default 字段選爲 qualified就可以了,如下面的圖 2 所示。

圖 2. 指定所有本地元素都要得到限定
Course.xsd Design 視圖的抓屏

這樣, elementFormDefault 屬性就被添加到了 schema 標記中,並被設置爲 qualified

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

   targetNamespace="http://www.utoronto.ca" 

   xmlns:course="http://www.utoronto.ca" elementFormDefault="qualified">

現在,請保存 Course.xsd 文件並再次調用 Create XML File 嚮導。這樣就將生成如下面的清單 3 所示的 Course.xml 文件。請注意,所有元素(全局的和本地的)都用前綴 course 加以限定。

清單 3. Course.xml 文件 — 限定的本地元素

<course:Schedule xmlns:course="http://www.utoronto.ca" 

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

   xsi:schemaLocation="http://www.utoronto.ca Course.xsd ">    

   <course:course>

      <course:courseId>courseId</course:courseId>

      <course:description>description</course:description>

   </course:course>

   <course:location>location</course:location>

</course:Schedule>

沒有目標名稱空間的 Schema
您可以使用 XML Schema Editor 來創建或導入如下所示的 Course1.xsd 模式文件。正如模式標記中未出現 targetNamespace 屬性所表明的那樣,這個 Course1.xsd 並不屬於某個名稱空間。

清單 4. Course1.xsd 文件 — 這個模式並不屬於某個名稱空間

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

   <xsd:element name="Schedule">

      <xsd:complexType>

         <xsd:sequence>

            <xsd:element name="course" type="CourseInfo"/>

            <xsd:element name="location" type="xsd:string"/>

         </xsd:sequence>

      </xsd:complexType>

   </xsd:element>



   <xsd:complexType name="CourseInfo">

      <xsd:sequence>

         <xsd:element name="courseId" type="xsd:string"/>

         <xsd:element name="description" type="xsd:string"/>

      </xsd:sequence>

   </xsd:complexType>    

</xsd:schema>

請注意這個模式的類型定義是如何不用前綴而進行調用的。舉例來說, CourseInfo 複雜類型(complex type)就是在元素 course 中不用前綴以 CourseInfo 的形式進行調用。要把 XML Schema 元素(如 complexType、string 等)和用戶在不屬於某個名稱空間的模式中定義的元素區別開來,我們可以按照 W3C 推薦(W3C recommendation)使用一個前綴(例如本示例中的 xsd )來顯式地限定 XML Schema 元素。

要生成實例文檔,請在 Course1.xsd 上調用 Generate XML File 嚮導。請注意名稱空間和一些前綴字段的空缺情況。單擊 Finish 就會生成如清單 5 所示的 Course1.xml 文件。

清單 5. Course1.xml 文件 — 用 xsi:noNamespaceSchemaLocation 來提供模式位置

<Schedule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

   xsi:noNamespaceSchemaLocation="Course1.xsd">     

   <course>

      <courseId>courseId</courseId>

      <description>description</description>

   </course>

   <location>location</location>

</Schedule>

讓我們再來看看 Course1.xml 文件。首先,請注意添加到根元素中的 xsi:noNamespaceSchemaLocation 屬性(而不是 xsi:schemaLocation 屬性)。這個屬性用來提供關於沒有名稱空間的模式文檔的位置的線索。這樣,您仍然可以對照相應的模式來驗證該實例文檔。再者,請注意到所有元素(全局的和本地的)都沒有加以限定。實際上,這個文檔看起來更像一個不使用名稱空間的傳統的 XML 文檔。

總之,如果您想讓實例文檔不需使用前綴,但卻能夠按照 XML Schema 而非 DTD 進行驗證,那麼這種模式是很有用的。然而,如果您想發佈您的模式以供其它模式重用,那麼,由於這種模式可能會因另一詞彙而導致名稱衝突,它就會令人很頭痛。

目標名稱空間爲缺省名稱空間的 Schema
您可以使用 XML Schema Editor 來創建或導入如下所示的 Course2.xsd 模式文件。

清單 6. Course2.xsd 文件 — 目標名稱空間與缺省名稱空間相同

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

   targetNamespace="http://www.utoronto.ca" 

   xmlns="http://www.utoronto.ca">

   <xsd:element name="Schedule">

      <xsd:complexType>

         <xsd:sequence>

            <xsd:element name="course" type="CourseInfo"></xsd:element>

            <xsd:element name="location" type="xsd:string"></xsd:element>

         </xsd:sequence>

      </xsd:complexType>

  </xsd:element>



  <xsd:complexType name="CourseInfo">

     <xsd:sequence>

        <xsd:element name="courseId" type="xsd:string"></xsd:element>

        <xsd:element name="description" type="xsd:string"></xsd:element>

     </xsd:sequence>

  </xsd:complexType>

</xsd:schema>

正如 targetNamespace 屬性所表明,這個模式的目標名稱空間是 http://www.utoronto.ca 。通過在該模式對象的 Prefix 字段中不指定前綴,我們使得這個模式的缺省名稱空間與目標名稱空間相同。

圖 3. 目標名稱空間沒有前綴
顯示讓模式對象的 Prefix 字段爲空白的抓屏

單擊 Apply 按鈕後,您將能注意到 xmlns 屬性被添加到了模式標記中,用來指定這個模式的缺省名稱空間是 http://www.utoronto.ca 。您還將能注意到 XML Schema 構造被自動用前綴 xsd (這一前綴可以從 XML Schema Preference 頁進行修改)加以限定,以將這些 XML Schema 構造與缺省名稱空間中的類型(如 Schedule )區別開來。

通過讓這個模式的目標名稱空間成爲缺省名稱空間,我們在對這個模式的類型進行引用時就不必對它們加以限定了(例如,不需要對 CourseInfo 加以限定)。請比較 Course2.xsdCourse.xsd ,確保您看到了其間的差別。

要生成這個實例文檔,請在 Course2.xsd 文件上調用 Generate XML File 嚮導。請注意前綴字段的空缺情況以及出現一條表明丟失了一個前綴的出錯消息的情況。請單擊 Edit 按鈕以啓動 New Namespace Information 對話框(請參看下面的圖 4)。請輸入一個前綴,例如 course 。單擊 Finish 將生成 Course2.xml 文件,並且這個文件應該與清單 2 中的 Course.xml 文件相似。

圖 4. 指定實例文檔的前綴
New Namespace Information 對話框的抓屏

多個模式和多個名稱空間
隨着模式變得越來越龐大,人們常常希望把一個模式分成若干個較小的模式,從而更易於維護和重用。借用諸如 W3C 之類的標準組織所開發的模式也是很普遍的事情。在這個部分中,我們將來看看在 XML Schema Editor 中創建模式時,如何使用來自多個模式的構造。我們還將分析本實例文檔中多個名稱空間的含義。

在開始之前,您要確保已經下載了 下面所提供的 namespace.zip 文件,並將 Calendar/Course.xsdCalendar/Job.xsd 解壓縮到您當前的工程中。

第 1 步. 創建 Calendar.xsd 文件
使用 Create XML Schema 嚮導在您當前的工程中創建 Calendar.xsd 模式文件。現在,您對這一步應該是駕輕就熟了。

第 2 步. 導入 Course.xsd 和 Job.xsd 模式文件
在 Outline 視圖中,單擊 Calendar文件對象並從彈出菜單中選擇 Add Import。這將在 outline 視圖中創建一個新的 import 元素對象。

單擊 import 對象。在 Schedule.xsd 模式對象的 Design 視圖中,使用 Select按鈕來調用 Select XML Schema file 嚮導。選擇 Select schema from Workbench projects選項。單擊 Next 並選擇 Course.xsd 模式文件。這將從 Course.xsd 文件導入一些定義,以便我們今後使用它們。此外,它還將檢索 Course.xsd 的名稱空間和名稱空間前綴。結果如下面的圖 5 所示。

圖 5. 導入 Course.xsd 模式
Schedule.xsd 模式對象的 Design 視圖的抓屏

切換到 Source 視圖查看源代碼。您將會注意到,除了 Course.xsdimport 元素之外, schema 元素中還自動生成了 xmlns:course 屬性。

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

   targetNamespace="http://www.ibm.com" 

   xmlns:Calendar="http://www.ibm.com" 

   xmlns:course="http://www.utoronto.ca">

現在,請重複上述步驟,爲 Job.xsd 文件添加 import 元素。

第 3 步. 添加一個約會(appointment)
我們將在 Calendar 模式中創建一個約會。這個約會將包含課程(course)和工作(job)的列表,這些課程和工作將構成我們的日常事務。

  1. 在 Outline 視圖中,添加一個全局元素 appointment ,並將它的類型指定爲匿名複雜類型(anonymous complex type)。
  2. 單擊匿名類型(anonymous type),然後選擇 Add Content Model。在 Design View 中將內容模型(content model)從 sequence改爲 choice。此外,把最小值(Minimum)字段設爲 0,把最大值(Maximum)字段設爲 unbounded
  3. 選擇 choice元素,並選擇 Add Element Ref添加一個元素引用。在 Reference name 字段中,請注意 course:Schedule 作爲一個選擇可用的情況。這是因爲我們在第 2 步中導入了來自 Course.xsd 文件的一些定義。請選擇 course:Schedule作爲我們想引用的元素。
  4. 請再次選擇 choice元素,然後選擇 Add Element Ref添加一個元素引用。在 Reference name 字段中,請注意 Job:JobInfo 作爲一個選擇可用的情況。這是因爲我們在第 2 步中導入了來自 Job.xsd 文件的一些定義。請選擇 Job:JobInfo作爲我們想引用的元素。
  5. 請給這個複雜類型添加兩個屬性, startTimeendTime

完成後的 Calendar.xsd 模式如下面的圖 6 所示。

圖 6. 導入了 Course.xsd 和 Job.xsd 的 Calendar.xsd
顯示完成後的 Calendar.xsd 的抓屏

第 4 步. 生成 Calendar.xml 文件
爲了生成與 Calendar.xsd 一致的實例文檔,請再一次在 Calendar.xsd 上調用 Generate XML File 嚮導。這個實例文檔將使用來自三個不同名稱空間的三個模式。請注意在 Select Root Element 頁中自動爲您進行檢測的情況。單擊 Finish 就將爲您生成一個有效的 Calendar.xml 文件。

圖 7. 生成帶有多個名稱空間的 Calendar.xml
Create XML File 的抓屏 — Select Root Element 嚮導

第 5 步. 使用 XML Editor 編輯 Calendar.xml 文件
在 XML Editor 中打開 Calendar.xml 文件。在 Design 視圖中,您很快就可以看到根元素 Calendar:appointment 下的名稱空間屬性值(例如, xmlns:Calendarxmlns:Jobxmlns:course )。爲了能夠進行驗證, xsi:schemaLocation 屬性必須包含指向相應模式的線索,如下面的圖 8 所示。

圖 8. 在 XML Editor 中編輯 Calendar.xml
顯示正在 XML Editor 中編輯 Calendar.xml 的抓屏

在本系列的 第 4 部分中,我們討論了在 XML Editor 中如何使用 XML Schema 或 DTD 提供受指導編輯。這樣的受指導編輯對名稱空間也是起作用的。例如,當您打開 Calendar:appointment 元素上的彈出菜單時,將注意到 Add Child會讓您選擇將 course:ScheduleJob:JobInfo 添加到 appointment 元素中。這種情況如下面圖 9 所示。

圖 9. 添加 <course:Schedule> 或 <Job:JobInfo> 元素
顯示如何添加元素的抓屏

結束語
本文概略講述了常用的 XML 名稱空間模式,並向您演示瞭如何用 WebSphere Studio Application Developer 的一些 XML 工具來設計 XML Schema 和 XML 實例文檔。正如文中所述,XML Schema 編寫者爲模式文檔選擇的名稱空間和限定對實例文檔的結構有諸多影響。這些 XML 工具所具有的生成能力使得您可以快速修改 XML Schema 並生成實例文檔,從而確保您設計的模式是正確的。

下載
NameSizeDownload method
0206_namespace.zip8 KBHTTP
*關於下載方法的信息
發佈了85 篇原創文章 · 獲贊 2 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章