【導讀】本文介紹 Visual Studio 2005/SQL Server 2005 環境中用于處理 XML 數據的三個選項,包括使用方案以及指導用戶在各選項之間進行選擇的指南。
一、System.Xml、SQLXML 和 XML 數據類型簡介
本節簡要介紹 Microsoft SQL Server 2000 中提供的 XML 支持的發展歷史,并概要介紹 Microsoft Visual Studio 2005/SQL Server 2005 環境中提供的用于處理 XML 和關系數據的三個選項。這三個選項是:1) System.Xml 命名空間中的類,2) SQLXML 類,3) SQL Server 2005 中提供的 XML 數據類型。
XML 支持最早添加到 Microsoft SQL Server 2000 中,為用戶提供以下功能:
• 將關系數據作為 XML 公開
• 將 XML 文檔拆分到行集合
• 通過使用 XML 數據精簡 (XDR) 方案,將 XML 方案映射到數據庫方案,從而創建 XML 視圖
• 使用 XPath 在 XML 視圖上創建查詢
• 在 SQL Server 中通過 HTTP 公開數據
此支持在 SQLXML Web 的后續版本中得到了進一步增強。增強功能包括:
• 更新程序和 XML 海量加載可以保留對 XML 視圖的更改
• 支持帶批注的 XML 方案定義語言 (XSD),以便描述映射(仍然支持 XDR,但不建議使用)
• 客戶端的 FOR XML
• SQLXML 托管類
• 支持 Web 服務
Microsoft .NET Framework 1.0 對讀取、寫入和處理 XML 文檔提供了廣泛的支持。這種支持在 .NET Framework 2.0 中得到了進一步增強,提高了各種 XML 類的性能和可用性。.NET Framework 在 System.Xml 命名空間中提供的新類可用于在 XML 數據與關系數據之間進行相互映射。
SQLXML 是一組使 SQL Server 數據庫中的關系數據能夠與 XML 無縫集成的庫和技術。它是一個中間層組件,不包括由 FOR XML 和 OPENXML 提供的服務器端 XML 支持。SQLXML 提供了一個方案驅動的映射方法,能夠從關系源數據生成 XML 并將表示關系信息的 XML 加載回關系表中。SQLXML 類對 SQL Server 2000(及更高版本)的數據庫提供了 XML 支持。
Microsoft SQL Server 2005 以 XML 數據類型的形式添加了內置的 XML 支持。XML 數據可以存儲在 XML 數據類型列內部。另外,通過將一個 XML 方案集合與此 XML 數據類型列關聯,還可以對其進行進一步的限制。存儲在 XML 數據類型列中的 XML 值可以借助 XQuery 和 XML 數據修改語言 (DML) 進行處理。可以在 XML 數據上建立索引,以增強查詢性能。此外,FOR XML 和 OPENXML 也已得到增強,能夠支持新的 XML 數據類型。
SQL Server 2005 中引入的存儲和處理 XML 數據的新功能與 SQL Server 早期版本中提供的 XML 功能結合在一起,為開發人員提供了多種在 XML 應用程序中存儲和處理 XML 數據的方法。由于使用 SQL Server 2005 提供的方法,有多種方法可以生成 XML 應用程序,因此,了解各種不同技術的方案,以及如何在各種技術之間進行權衡和配合對于作出正確的選擇是至關重要的。本文提供了如何選擇適當的方法,使用 SQL Server 2005 開發 XML 應用程序的指南。
二、XML 使用方案
XML 的應用領域可大致劃分為:
• 用于商業集成的 XML:商業集成,也稱為企業應用集成 (EAI),包括 A2A(應用程序對應用程序)、B2B(企業對企業)以及 B2C(企業對用戶)應用程序。運行在不同系統上的應用程序使用基于 XML 的消息相互通訊。
• 用于內容管理的 XML:使用基于 XML 的內容管理系統,用戶可以存儲、檢索、修改和查詢 XML 文檔。這些系統以其原有格式存儲 XML 文檔。
下面介紹符合上述分類的幾種方案。這些方案的解決方案將在以下幾節中給出,并且會詳細介紹 SQL Server 2005/Visual Studio 2005 環境中提供的各種 XML 選項的處理情況。
方案 1:保險理賠
一家汽車保險公司在 Internet 上提供服務,允許其投保人或代理通過公司的網站進入保險理賠。理賠將由位于公司總部的中央系統進行處理。處理完畢后,系統會將與該理賠相關的信息以指定的 XML 格式存儲起來。系統中必須保留這些 XML 文檔的精確副本,以便用于法律用途。此方案展示了 XML 在內容管理中的應用。
方案 2:汽車制造商與零件供應商之間的數據交換 I
一家汽車制造商與多家零件供應商進行交互,以便獲得公司所需的零件。通常,該制造商要接收供應商的發票。然后,將與發票相關的數據手動輸入到老式的發票處理系統中。發票處理系統以關系格式存儲數據。而現在,該制造商希望將發票數據自動輸入到老式的發票處理系統中。此方案是 XML 用于商業集成的示例。
方案 3:汽車制造商與零件供應商之間的數據交換 II
此方案包含一家與多家零件供應商進行交互的汽車制造商,如前一方案中所述。該制造商目前使用的系統不能為供應商提供查詢發票狀態或者從制造商獲得付款說明的副本的功能。目前,供應商只能通過電話獲得這些信息。該汽車制造商需要通過 Web 公開這些信息,以使供應商能夠自動執行這些任務。此方案展示了 XML 在商業集成中的應用。
方案 4:內容管理系統
某公司通過 Web、書籍和 CD-ROM 等多種渠道向其客戶提供醫學、法律和技術等領域的信息。該公司要建立一套內容管理系統,以幫助其在較短的時間內向客戶提供高質量的內容。此方案展示了 XML 在內容管理中的應用。
方案 5:客戶調查
某公司在 Internet 上提供機票預訂業務,要對每個季節進行調查,以確定當前季節最受客戶喜愛的旅游地點。每個季節所用的調查表均不同,而且將來調查表也可能改變。該公司將對調查信息進行分析,并根據分析結果設計出滿足大多數客戶要求的旅游套餐。此方案可看作 XML 在內容管理中的應用。
三、.NET Framework 中的 XML 類
Microsoft .NET Framework 對開發基于 XML 的產品提供了卓越的支持。在 .NET Framework 中,XmlTextReader、XmlTextWriter、XmlDocument 和 XmlValidatingReader 等核心類可以在 System.Xml 命名空間中獲得,該命名空間是所有 XML 類的根命名空間。使用這些核心類,用戶可以使用基于數據流和基于 DOM(基于文檔對象模型)的兩種瀏覽/訪問模型來讀取、寫入和驗證 XML 文檔。System.Xml 命名空間包含以下子命名空間:
• System.Xml.Schema - 包含用于處理 XML 方案定義語言 (XSD) 方案的類。
• System.Xml.Serialization - 提供將對象序列化為 XML 格式的文檔或數據流的類。
• System.Xml.XPath - 包括使用 XPath 表達式瀏覽 XML 文檔的類。
• System.Xml.Xsl - 具有用于執行可擴展樣式表轉換 (XSLT) 的類。
System.Xml 命名空間的增強功能
在 Visual Studio 2005 中,新類(如 XsltCommand)和對現有 XML 類(如 XmlDocument)的增強可用于對 XML 數據進行各種操作,包括修改 XML 文檔、應用 XSL 轉換等。
Visual Studio 2005 中與 System.Xml 命名空間中的 XML 類相關的一些增強功能如下:
• XmlDocument 類添加了 XML 方案驗證支持。
• XmlReader 和 XmlWriter 類的功能得到了增強,性能顯著提高,并支持 XML 方案類型。而且,還添加了靜態 Create 方法,提供了一種較為簡單的方法,可使用 XmlReaderSettings 和 XmlWriterSettings 類創建 XmlReader 和 XmlWriter 實例,以便配置所創建的類型。
有關 System.Xml 增強功能的詳細信息,請參見 What's New in System.Xml for Visual Studio 2005 and the .NET Framework 2.0 Release 白皮書。
System.Xml 命名空間中的類可用于實現自定義的 XML 分析、處理和存儲邏輯。利用 SQL Server 2005 的公共語言運行庫 (CLR) 的宿主功能以及 Visual Studio 2005 中的 XML 類,可以在中間層或數據庫層處理 XML。
.NET Framework 中的 XML 類的使用包括將 XML 文檔作為類型 [n]varchar(max) 或 [n]varbinary(max) 的列保存在數據庫中,或者作為文件保存在文件系統中,以及使用 System.Xml 命名空間中的類在中間層或數據庫層處理這些文檔。.NET Framework 中的 XML 類還可用于操作以 XML 數據類型存儲的數據。
.NET Framework 中的 XML 類適用于以下情況:
• 訪問 .NET Framework XML 的所有功能,如數據流分析、文檔類型定義 (DTD)、XSD 驗證、XSLT 處理等。
• 僅僅將 SQL Server 用作 XML 文檔的數據存儲區,不需要在數據庫內部進行深入訪問。
• 使用 .NET Framework 中的 XML 類進行 XML 文檔的大多數或全部處理并在文檔級進行更新。
可以使用 [n]varchar(max)、[n]varbinary(max) 或 XML 數據類型來存儲 XML。
如果使用 [n]varchar(max) 或 [n]varbinary(max),可以獲得以下好處:
• 可以保留 XML 文檔的高保真的副本,包括空格和格式。
• 應用程序在對整個文檔進行插入和檢索操作方面可以獲得可能實現的最高性能。
后面將介紹使用 XML 數據類型的好處。
在中間層進行 XML 處理
可以使用 .NET Framework 提供的各種 XML 類在中間層進行 XML 處理。如上所述,采用這種方法時,XML 文檔可以作為類型 [n]varchar(max) 的列或 XML 存儲在數據庫中,也可以作為文件存儲在文件系統中。在中間層,這些文檔是從數據庫中檢索并根據用戶的需要進行處理的,如下所述:
• 如果需要讀取 XML 文檔,可以使用通過 XmlReader.Create() 方法創建的 XmlReader 來加載從數據庫中獲得的文檔。使用 Read() 瀏覽文檔。XmlReader 類提供對 XML 文檔的最快的只讀、只向前和非緩沖的訪問。
• 如果需要對 XML 文檔進行寫入訪問并需要對 XML 數據進行完全瀏覽訪問,則可以使用 XmlDocument 類加載和訪問 XML 文檔。XmlDocument 是文檔對象模型 (DOM) 在 .NET Framework 中的一種實現,它是 XML 文檔在內存中的樹型表示,使用它可以瀏覽和編輯此文檔。
• 如果需要根據 DTD/XSD 來驗證 XML 文檔,或者在運行時獲得 XSD 信息,則可以使用 XmlReader 類。在 XmlReaderSettings 類上,創建方法時將 XsdValidation 或 DTDValidation 設置為 True。還可以設置 ValidationEventHandle() 事件處理程序來處理讀取過程中出現的驗證錯誤。
• 如果需要對 XML 文檔應用 XSL 轉換,可以使用 XPathDocument 類加載 XML 文檔,然后使用 XslCommand 類應用轉換。XPathDocument 類使用 XSLT 為 XML 文檔處理提供了快速的高性能緩存。
• 如果需要使用 XPath 表達式來查詢 XML 文檔,則可以使用 XPathDocument(只讀)或 XmlDocument(讀/寫)來加載 XML 文檔。使用 CreateNavigator() 方法創建一個 XPathNavigator 實例,并將所需的 XPath 表達式作為參數傳遞給 XPathNavigator 的 Select() 方法。
在數據庫中進行 XML 處理
SQL Server 2005 與 CLR 的集成使開發人員也能夠使用 .NET Framework 提供的 XML 類在數據庫層進行處理。這種集成提供了以 .NET Framework 支持的任何語言編寫存儲過程、函數、觸發器以及用戶定義的類型的功能。此外,CLR 宿主還提供了訪問整個 .NET Framework 基類庫的功能。因此,上一節中介紹的各種 XML 處理選項也可以在數據庫中使用。
使用 CLR 集成的優點如下:
• 它提供了使用面向對象語言(如 C# 和 Visual Basic .NET)以托管代碼的形式編寫數據庫對象的能力。
• 托管的數據庫對象比 SQL Server 早期版本中提供的擴展存儲過程更安全。
• 它具有定義用戶定義的數據類型和用戶定義的合計的能力。
• 在某些情況下,編譯的托管數據庫對象比 Transact-SQL 具有更高的性能。
在 SQL Server 2005 中,數據庫開發人員可以選擇兩種方法來編寫存儲過程、觸發器和用戶定義的函數。這兩種方法是 Transact-SQL 和可在 .NET Framework 中使用的任何語言,如 C# 或 Visual Basic .NET。語言的選擇取決于對數據執行的操作類型。如果代碼在進行大多數數據訪問時只需要使用很少甚至不使用過程邏輯,選擇 Transact-SQL 最合適。托管類最適用于數學性較強的函數和過程,如字符串處理、日期操作、系統資源訪問、文件訪問、圖像處理等。
在數據庫層使用 .NET Framework 中的 XML 類的步驟如下:
• 開發托管程序集。使用可在 .NET Framework 中使用的任何語言,以程序集的形式實現處理功能,并將程序集打包為 DLL。程序集也可以引用其他程序集。
• 注冊程序集并授予權限。使用 .NET Framework 開發的程序集可以使用 CREATE ASSEMBLY T-SQL 語句注冊到 SQL Server 中。注冊程序集時,還可以指定要授予該程序集的代碼訪問權限。使用 DROP ASSEMBLY T-SQL 語句可以取消程序集的注冊。
• 向 T-SQL 公開托管類型。程序集提供的處理功能可以通過用戶定義的標量函數、用戶定義的表函數、用戶定義的過程 (UDP) 或者用戶定義的觸發器向 T-SQL 公開。用戶定義的標量函數可在任何標量表達式中使用;用戶定義的表函數可在任何 FROM