即使世界明天毀滅,我也要在今天種下我的葡萄樹。
          posts - 112, comments - 14, trackbacks - 0, articles - 11

          技巧:引用 XML 模式

          Posted on 2006-05-15 14:19 閱讀(190) 評論(0)  編輯  收藏 所屬分類: XML Design
          請開始使用 XML 模式來約束 XML 文檔。這篇簡短的技巧說明會告訴您如何從 XML 文檔中引用 XML 模式。五段樣本代碼將顯示如何實現。

          隨著 W3C 最近確定了 XML 模式規范,您可能應開始使用模式了。與使用 DTD(文檔類型定義)定義約束相比,模式可以給您更好的靈活性和確定性。本技巧說明演示了使用模式的一個重要部分:如何在文檔中引用它們。即使其他人正在編寫模式,您可能需要知道如何在 XML 文檔中引用它們。

          早期的 DTD

          首先,讓我簡要地比較一下以供參考。在 XML 模式之前,每個人都使用 DTD 來進行約束,而且很多人現在仍這么做。要使用 DTD 進行約束,應在 XML 文檔中使用 DOCTYPE 聲明來引用 DTD,如“清單 1”所示:


          清單 1. 引用 DTD
          <?xml version="1.0"?>
          <DOCTYPE hockeyTeam SYSTEM "dtd/hockeyTeam.dtd">

          <hockeyTeam>
          <team name="Dallas Stars">
          ? <!-- More XML Content -->
          </team>
          </hockeyTeam>

          在“清單 1”的文檔中,所引用的 DTD 名叫 hockeyTeam.xml ,它在目錄 dtd 中。可以在 XML 文檔的 DOCTYPE 標記中指定約束,以代替在獨立的 DTD 文檔中指定約束。對于這個示例,我使用了一個擁有 XML 約束的獨立 DTD 文檔,因為這是一個更好的設計,而且因為它與需要使用 XML 模式的方法類似。

          名稱……空間中有什么?

          除了理解 XML 的基礎,您還需要掌握 XML 名稱空間規范的一些知識(請參閱 參考資料 )。該規范的優點超出了本篇技巧說明的范圍,但您需要知道的是名稱空間基本上是將一個前綴(如 nhl )綁定到某個特定 URI(如 http://www.nhl.com)。可以將前綴添加到元素名稱的開頭(例如, nhl:hockeyTeam ),以便將該元素放到相關 URL 標識的名稱空間中。如果指定了 URL,但是 沒有指定前綴,那么該名稱空間會成為 缺省名稱空間;沒有前綴的元素將落入缺省名稱空間。“將缺省名稱空間看作是帶有空的前綴的名稱空間”可能會對理解它有所幫助。名稱空間聲明的使用及其前綴讓您可以在一個模式使用多個名稱空間中的元素定義。

          一個 XML 模式可以對一個名稱空間設置約束。因此,如果在一個 XML 文檔中有 4 個名稱空間,而且您要約束所有名稱空間中的所有元素,通常需要 4 個 XML 模式。對于每個名稱空間,都需要指定約束該名稱空間的模式。再次聲明,名稱空間在內容和功能之間提供了一種很好的分離方法。

          切入正題

          好,基礎知識已經介紹得足夠多了;現在切入正題。

          首先需要在文檔中聲明“XML 模式實例”名稱空間,以授予您對引用 XML 模式時需要的屬性的訪問權。當然,要添加前綴映射( xsi )和相關 URI,如“清單 2”中所示。我還添加了一個缺省名稱空間 http://www.nhl.com,以便為文檔中的所有無前綴元素提供駐留地(在本示例中,所有元素都是無前綴元素)。


          清單 2. 定義“XML 模式實例”名稱空間
          <?xml version="1.0"?>

          <hockeyTeam xmlns="http://www.nhl.com"
          ??????????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
          <team name="Dallas Stars">
          ? <!-- More XML Content -->
          </team>
          </hockeyTeam>

          一旦“XML 模式實例”名稱空間可用,就可以使用其內部的 schemaLocation 屬性了。該屬性的值其實是 兩個值。第一值,或自變量,是要約束的名稱空間。在本示例中,這個值是 http://www.nhl.com ,即缺省名稱空間。第二個值,或自變量,是用于名稱空間約束的 XML 模式的位置。要查看這個值,請參考“清單 3”:


          清單 3. 引用 XML 模式
          <?xml version="1.0"?>

          <hockeyTeam xmlns="http://www.nhl.com"
          ??????????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          ??????????? xsi:schemaLocation="http://www.nhl.com schemas/hockeyTeam.xsd">
          <team name="Dallas Stars">
          ? <!-- More XML Content -->
          </team>
          </hockeyTeam>

          請注意名稱空間 URI 和模式之間的空格。 插入該空格需小心;省去這個空格會給您帶來各種麻煩!此外,請注意,模式位置可以就是一個 URI,如“清單 4”所示:


          清單 4. 使用 URI 作為模式位置
          <?xml version="1.0"?>

          <hockeyTeam xmlns="http://www.nhl.com"
          ??????????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          ??????????? xsi:schemaLocation="http://www.nhl.com
          ??????????????????????????????? http://www.nhl.com/hockeyTeam.xsd">
          <team name="Dallas Stars">
          ? <!-- More XML Content -->
          </team>
          </hockeyTeam>

          好了。添加新的名稱空間和模式很簡單,只涉及到將 第二(或第三或第四)對值添加到 schemaLocation 屬性。清單 5 將一個新的名稱空間添加到 XML 文檔中,并且添加了另一個與其相關的模式。


          清單 5. 引用多個模式
          <?xml version="1.0"?>

          <hockeyTeam xmlns="http://www.nhl.com"
          ??????????? xmlns:stars="http://www.dallasstars.com"
          ??????????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          ??????????? xsi:schemaLocation="http://www.nhl.com
          http://www.nhl.com/hockeyTeam.xsd
          http://www.dallasstars.com http://www.dallasstars.com/stars.xsd"">
          <team name="Dallas Stars" stars:logo="http://www.dallasstars.com/logo.jpg">
          ? <!-- More XML Content -->
          </team>
          </hockeyTeam>
          如果您正在使用模式或者打算使用它們,那么您一定要掌握 XML 模式規范(從第 0 部分開始),因為在引用模式、使用模式(無論帶不帶名稱空間)和設計文檔約束時有許多選項。無論您使用這些特性的哪種組合,請明智地約束 XML,玩得開心點!

          參考資料

          主站蜘蛛池模板: 同江市| 高唐县| 五峰| 乌拉特中旗| 潮安县| 沛县| 泰兴市| 宣汉县| 淅川县| 丰原市| 湘乡市| 铜山县| 宣汉县| 绥滨县| 武功县| 禹州市| 泽普县| 怀安县| 通许县| 巴塘县| 刚察县| 多伦县| 嵊州市| 延吉市| 青州市| 姚安县| 临武县| 昌邑市| 牡丹江市| 苍山县| 繁昌县| 临泉县| 融水| 潼关县| 乳山市| 石首市| 仪征市| 新晃| 绥芬河市| 陇南市| 文成县|