DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 初識 CAM:一種新的 XML 驗證技術
初識 CAM:一種新的 XML 驗證技術
編輯:XML詳解     

CAM 的前輩

  如上所說,CAM 代表著驗證 XML 文檔的最新技術。當然,這就意味著以前也有驗證 XML 文檔的技術。

  常用縮寫詞

  CCTS (Core Components Technical Specification):核心組件技術規范

  DTD (Document Type Definition):文檔類型定義

  IT (information technology):信息技術

  OWL (Web Ontology Language):Web 本體語言

  XPath (XML Path Language):XML 路徑語言

  XML (Extensible Markup Language):可擴展標記語言

  XSD (XML Schema Definition):XML 模式定義

  最早的技術稱為文檔類型定義,即 Document Type Definition (DTD)。隨著新興技術的推出,它的局現性顯現出來。它推動了 XML 文檔結構的驗證,但在語義方面表現不夠。它還使用有些拙笨的語法來定義有效的 XML 結構。

  DTD 後來被 XSD 所取代,即 XML Schema Definition(XML 模式定義)。這是一種更為強大的驗證 XML 文檔的方式。首先,其語法類似於 XML 文檔本身。其次,它改進了對語義的支持。最近幾年,前沿技術人員已經選擇使用 XSD 來驗證其 XML 文檔,逐漸拋棄了 DTD。

  走近 CAM

  技術發展史表明,人們一直在尋找更好的方式來解決技術問題。XML 驗證技術也毫不例外。在用於驗證 XML 文檔的各種技術中,CAM 代表著最新和最完善的技術。

  CAM 由 OASIS 標准組織推出。該組織推出了很多規范,最有名的是有關 Web 服務的規范和電子商務 XML(electronic business Extensible Markup Language, ebXML)。

  CAM 相比其前輩,要更加靈活和強大。與 XSD 不同,它不會將數據結構與業務規范綁定在一起。它還提供內容驅動的驗證,這在 XSD 和 DTD 中是不具備的。

對於大多數熟悉 XML 的人來說,CAM 要比 XSD 或 DTD 更易於學習。這是因為,在定義結構方面,CAM 文檔的格式非常類似於一個 XML 實例。並且,在定義業務規范方面,CAM 使用了大家熟悉的 XPath。

  CAM 模板的結構

  從 清單 1中可以看到,CAM 模板的結構一點也不復雜。


清單 1. CAM 模板的結構

 <as:CAM XMLns:as="http://www.oasis-open.org/committees/cam" 
 CAMlevel="1" 
 version="1.0"> 
 <as:Header /> 
 <as:AssemblyStructure /> 
 <as:BusinessUseContext /> 
 </as:CAM> 

  根元素 CAM定義了整個模板本身使用的名稱空間以及 CAM 的層次和版本。

  Header元素提供了有關驗證文檔的特定信息。許多子元素(未給出)是顧名思義的:Description、Owner、Version和 DateTime。

  AssemblyStructure元素定義了 XML 文檔實例的實際結構。這就是 CAM 和 XSD 的區別之一。AssemblyStructure元素提供針對 XML 文檔結構的驗證,但不包含有關語義的任何信息。

  最後,BusinessUseContext元素提供了以前的元素所缺少的業務規則。如何實施這些業務規范呢?這是一個非常好的問題,不過您首先應該熟悉 CAM 是如何定義結構的。

  CAM 如何定義結構

  清單 2給出了 CAM 如何定義一個簡單購買訂單的結構。


清單 2. 簡單購買訂單的 CAM 結構

 <as:AssemblyStructure> 
 <as:Structure ID="myPO" taxonomy="XML"> 
 <PurchaSEOrder> 
 <ShippingAddress> 
  <Name>%string%</Name> 
  <Street>%string%</Street> 
  <City>%string%</City> 
  <State>%string%</State> 
  <Zip>%string%</Zip> 
 </ShippingAddress> 
 <ShipDate>%DD-MM-YYYY%</ShipDate> 
 <comment>%string%</comment> 
 <LineItems> 
  <LineItem> 
  <ItemName>%string%</ItemName> 
  <Quantity>%1%</Quantity> 
  <Price>%54321.00%</Price> 
  <Comment>%string%</Comment> 
  </LineItem> 
  </LineItems> 
  <TotalPrice>%54321.00%</TotalPrice> 
  <ShippingMethod>%string%</ShippingMethod> 
 </PurchaSEOrder> 
 </as:Structure> 
 </as:AssemblyStructure> 


 

在閱讀 清單 2時,注意所定義的 XML 文檔的結構,它幾乎就是一個 XML 實例。從這一方面來講,大多數 IT 專業人員都認同,對於已經了解 XML 語法的人來說,CAM 比 XSD 更易於閱讀。實際上,CAM 就是作為 XML 實例來描述的,但帶有一些不相關的內容,這一點我會在下面解釋。

  Structure元素是實際結構定義的父級。它有一個 ID屬性,用於識別此特殊結構。taxonomy屬性的唯一當前可用值是 XML。

  注意,大多數元素包括用百分號 (%) 分開的值。它只是將要包含在 XML 實例中的實際內容的占位符。相比於給出任何驗證邏輯而言,這樣做只是為了使文檔更易於理解。有些人在構建 CAM 模板時,實際上會在元素中采用一些示例值,而不是使用 清單 2中所示的通用值。如何更好地使用占位符取決於開發人員的習慣。

  您已經了解如何在 CAM 中定義結構,現在我們來了解一下如何實施業務規則。

  CAM 如何實施業務規則

  下面是一個這樣的例子:XPath。

  是的,沒錯。一個 XPath 的例子。

  現在我們可以看到 CAM 相比較早驗證技術的另一項優勢。它使用大多數 XML 技術人員已經用於實施業務規則的語法。對於這些人來說,他們不必學習另一種語言即可在其應用程序中實現 CAM 驗證。

  清單 3是一個 BusinessUseContext元素的例子。


清單 3. 利用 CAM 實施業務規則

 <as:BusinessUseContext> 
 <as:Rules> 
 <as:default> 
  <as:context> 
  <as:constraint action="makeRepeatable(//PurchaSEOrder/LineItems/LineItem)"/> 
  <as:constraint action="makeOptional(//LineItem/Comment)"/> 
  <as:constraint action="setLength(//ShippingAddress/State,2)"/> 
  <as:constraint action="setDateMask(//PurchaSEOrder/ShipDate,DD-MM-YYYY)"/> 
  <as:constraint action="setNumberMask(//LineItem/Quantity,###)"/> 
  <as:constraint action="setNumberMask(//LineItem/Price,###.##)"/> 
  <as:constraint action="setNumberMask(//PurchaSEOrder/TotalPrice,###.##)"/> 
  <as:constraint condition="//PurchaSEOrder/TotalPrice > 100" 
   action="makeOptional(//PurchaSEOrder/ShippingMethod)"> 
  </as:context> 
 </as:default> 
 </as:Rules> 
 </as:BusinessUseContext> 

對於有經驗的 XML 開發人員,應該很容易看懂這個結構。這不僅僅因為約束使用了 XPath,還因為驗證規則使用了標准英語來命名。這就是 CAM 的魅力所在。

  這些規則本身在 context元素中定義。每個規則是 constraint子元素之一的 action參數。

  注意第一個規則:makeRepeatable(//PurchaSEOrder/LineItems/LineItem)。顧名思義,它告訴驗證器,LineItems元素的 LineItem子元素是可重復的。這表示可以有多個這樣的子元素,這完美地解釋了在一個典型購買訂單中可以包含多個不同的條目。

  下一條規則是關於 Comment元素的。此規則聲明,注釋是可選的。換句話說,XML 文檔在帶有空的 Comment元素時是有效的。

  下一條規則用於限制 State元素的最長字符數。在本例中,最大長度是 2,這表示美國各個州的郵政縮寫。

  下一條規則是日期格式。這裡,使用了格式 DD-MM-YYYY,當然您也可以使用其他格式。在本例中,有效的日期應該類似於 03-03-2009,表示 2009 年 3 月 3 日。

  下一條規則是 Quantity元素的格式。在本例中,該元素的內容必須是匹配 ###掩碼的數字。換句話說,購買訂單中的條目如果 Quantity元素是四位數字,則認為是無效的。按此規則,購買訂單不能包含同一產品訂購數量超過 999 的條目。

  接下來的兩條規則,Price和 TotalPrice,類似於上一條規則。與 Quantity一樣,它們受到數字掩碼的約束。不同之處在於,這裡的數字掩碼允許小數點。這是因為這兩個元素是美元值,可以包含代表分的小數值。

  最後,還有一個特別重要的規則,因為它引入了內容驅動的約束 (context-driven constraint)。確切含義是什麼呢?它是一個約束,可以驗證基於某些元素內容的 XML 文檔。在本例中,如果購買訂單的總價格超過 $100,則 XML 文檔的 ShippingMethod元素可以是空的。否則,它不能是空的。這裡適用的業務規則是,總價超過 $100 的訂單將獲得免費配送。對於總價少於 $100 的訂單,文檔必須指定一種配送方法。

小結

  清單 4給出了利用上面介紹的片段組裝起來的整個 CAM 文檔。


清單 4. 完整的 CAM 文檔

 <?XML version='1.0'?> 
 <as:CAM CAM level="1" version="1.0" 
 XMLns:as="http://www.oasis-open.org/committees/cam" > 
 <as:Header> 
 <as:Description>Simple Purchase Order</as:Description> 
 <as:Owner>developerWorks</as:Owner> 
 <as:Version>0.1</as:Version> 
 <as:DateTime>2009-07-07T12:00:00</as:DateTime> 
 </as:Header> 
 <as:AssemblyStructure> 
 <as:Structure ID="myPO" taxonomy="XML"> 
 <PurchaSEOrder> 
 <ShippingAddress> 
  <Name>%string%</Name> 
  <Street>%string%</Street> 
  <City>%string%</City> 
  <State>%string%</State> 
  <Zip>%string%</Zip> 
 </ShippingAddress> 
 <ShipDate>%DD-MM-YYYY%</ShipDate> 
 <comment>%string%</comment> 
 <LineItems> 
  <LineItem> 
  <ItemName>%string%</ItemName> 
  <Quantity>%1%</Quantity> 
  <Price>%54321.00%</Price> 
  <Comment>%string%</Comment> 
  </LineItem> 
  </LineItems> 
  <TotalPrice>%54321.00%</TotalPrice> 
  <ShippingMethod>%string%</ShippingMethod> 
 </PurchaSEOrder> 
 </as:Structure> 
 </as:AssemblyStructure> 
 <as:BusinessUseContext> 
 <as:Rules> 
 <as:default> 
  <as:context> 
  <as:constraint action="makeRepeatable(//PurchaSEOrder/LineItems/LineItem)"/> 
  <as:constraint action="makeOptional(//LineItem/Comment)"/> 
  <as:constraint action="setLength(//ShippingAddress/State,2)"/> 
  <as:constraint action="setDateMask(//PurchaSEOrder/ShipDate,DD-MM-YYYY)"/> 
  <as:constraint action="setNumberMask(//LineItem/Quantity,###)"/> 
  <as:constraint action="setNumberMask(//LineItem/Price,###.##)"/> 
  <as:constraint action="setNumberMask(//PurchaSEOrder/TotalPrice,###.##)"/> 
  <as:constraint condition="//PurchaSEOrder/TotalPrice > 100" 
   action="makeOptional(//PurchaSEOrder/ShippingMethod)"> 
  </as:context> 
 </as:default> 
 </as:Rules> 
 </as:BusinessUseContext> 
 </as:CAM> 

如上所示,清單 4比清單 2和 3合起來還多一點。添加了 Header元素,它用於識別有關此特定驗證文件的信息。在本例中,添加了一段簡單的描述、所有者和版本和文檔日期。

  雖然在 清單 4中沒有給出,Header元素還可以包含其他參數。XML 文檔的驗證隨參數值的不同而不同。例如,如果一個名為 noMoreThan10LineItems的參數設置為 true,則 CAM 文檔將實施在整個訂單中不超過 10 個 LineItem元素的業務規則。這是 CAM 在實施驗證時多麼強大和多麼靈活的一個例子。這裡的好處在於,您只需將該參數更改為 false即可取消該規則。

  CAM 相比其競爭對手的優勢

  顯然,某項技術是新的,並不代表它是有用的,或是比其前輩提供更高的投資回報。不過,CAM 相比其競爭對手,具有多項顯著的優勢。

  首先,CAM 將結構與業務規則分離開來。這是整個軟件開發的一種遞歸模式,根本不僅僅限於 CAM。例如,分布式對象開發環境中的模型 - 視圖 - 驅動器 (MVC) 模式將模型與視圖和控制器分離開來。與 CAM 不同的是,XSD 將結構和業務規則緊密耦合在一起,這導致了更昂貴的維護開銷。

  CAM 還支持內容驅動的驗證。換句話說,CAM 識別基於某些元素或屬性的動態結構。因此,如果元素 X 包含某個值,業務規則應用於元素 Y。如果元素 X 包括另一個值,該業務規則可以應用於元素 Z。 這在 清單 3的最後一個規則中說明了。在該例中,購買訂單文檔若總價超過 $100 則不需要指定配送方式,因為對於這種訂單是免費配送的。CAM 的前輩不易實現這種復雜的驗證。

  在 CAM 中分析規則集和結構更加容易。結構就是一個 XML 實例,采用常用的樹格式表示,因此人類及計算機更易於閱讀。用於實施業務規則的語法同樣很直觀:makeRepeatable、makeOptional、setLength等都不難理解。還有,雖然規則和結構是分離的,但它們都在同一文檔中,很容易獲得整體驗證需求的大致了解。另一方面,XSD 需要理解一整套新的非直觀的定義,比如 complexType(它是什麼意思呢?),並且它不易分析出來。

堅定“不必學習任何新東西”的理念,CAM 使用了 XPath。上面已經提到,這是一種對某些元素實施業務規則的語言。不僅僅因為 XPath 很直觀且易於學習,還因為它易於被大多數 XML 技術人員所理解。這使得向 CAM 的過渡變得更容易,因為總體上來說,業務邏輯驗證不需要 XML 開發人員學習任何新內容。XSD 語法一點也不像 XPath。

  CAM 超過 XSD 的另一項優勢在於,利用 CAM 更容易滿足本地化需求。使用 XSD 時,枚舉是靜態的,因此無法做到上下文感知。然而,利用 CAM,您可以基於上下文值應用特定枚舉。在新興的全球市場環境下,這種簡化驗證的需求應該是自成一體的。

  CAM 模板還支持下一代面向服務的架構 (Service-OrIEnted Architecture,SOA)。CAM 支持業務流程技術,如 Business Process Execution Language (BPEL)、Business Process Specification Schema (BPSS) 和 Business Process Modeling Notation (BPMN) 建模工具。下面引用 Wiki 上的話:“為了完善 SOA,CAM 具有擴展機制,可用於支持語義注冊引用(如 ebXML-regrep)和元數據定義(如 CCTS 和 OWL),這是下一代 SOA 交換的關鍵。” 同樣,CAM 由 OASIS 開發,因此,您可以確信,該組織將會確保 CAM 與它的其他標准是兼容的。

  結束語

  CAM 代表著最新一代的 XML 驗證技術。它具有超出其前輩的各種優勢。這些優勢包括有關結構和業務邏輯的關注點分離、基於上下文的動態驗證、與前沿技術的互操作性、低維護開銷和易學性。CAM 由廣受尊重的標准組織 OASIS 推出。

  CAM 是一門新興技術。因此,它還沒有什麼學習資料和實踐經驗。不過,它在初次發布時,肯定是相當強大的,它將是一種用於 XML 驗證的更有效的方法。

  這裡可以斷言的是,CAM 肯定會替代其前輩。




 

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