使用XmlValidatingReader類驗證讀取Xml文檔
.Net程式集System.Xml包含了許多類,這些類用於在.Net平台上提供Xml功能。 XmlValidatingReader類(XmlReader類的一種實現)就是其中的一種。在將xml文檔或Xml片段讀入系統時,該類提供驗證支援。它實現 DTD、XML 資料簡化 (XDR) 架構和 XML 結構定義語言 (XSD) 架構等規範所定義的有效性約束。
1、構造XmlValidatingReade類對象執行個體
初始化XmlValidatingReader類的新執行個體有多種方法,最常用的一種是傳入XmlReader類型的參數:
public XmlValidatingReader( XmlReader reader);
XmlValidatingReader vReader=new XmlValidatingReader(XmlTextReader xtr);
作為XmlReader的具體實現之一,XmlTextReader類提供對Xml文檔的快速、只前進、無緩衝的讀取,而XmlValidatingReader可以使用從XmlTextReader所返回的所有內容,並進一步提供驗證支援。當然,如果一切正常,該過程不會造成資訊丟失,從給定的 XmlReader 返回的所有節點和屬性也都從此驗證讀取器返回。未從基礎讀取器返回的新節點可能由此讀取器添加(例如,實體引用的預設屬性和子級)。
2、指定驗證類型
從前面已經能知道,有三種規範用於對xml文檔執行驗證。它們是DTD、XDR及XmlSchema。所以,在執行驗證之前,需要確定驗證的類型,這通過設定ValidatingReader類的ValidationType屬性來完成:
vReader.ValidationType=ValidationType.Schema.
這行代碼將驗證聲明為XSD Schema。
3、使用XmlSchemaCollection類緩衝架構
如果需要根據XDR或者XSD Schema進行驗證,可以使用XmlSchemaCollection類來緩衝架構,這樣將可以提高效能。XmlSchemaCollection類的Add方法載入架構,同時,架構會與命名空間 URI 關聯。對於"XML 結構描述"的源檔案(.xsd)來說,這通常會是架構的 targetNamespace 屬性。
XmlSchemaCollection xsc=new XmlSchemaCollection();
Xsc.Add("http://www.tuha.net","vschema.xsd");
當然,如果架構內聯於Xml文檔中,就不需要這樣做了。
4、關聯架構快取
在向XmlSchemaCollection中添加完schema之後,XmlValidatingReader並不能自動識別並使用schema,還需要將兩者關聯起來。通過使用讀取器的 Schemas 屬性引用緩衝在 XmlSchemaCollection 中的架構檔案來完成這一過程:
vReader.Schemas.Add(xsc);
5、ValidationEventHandler事件處理常式回調
在使用ValidatingReader執行驗證讀取Xml文檔時,可能發生意外。這時,可以通過ValidationEventHandler 回調報告驗證錯誤和警告。ValidationEventHandler 事件用於設定一個事件處理常式以接收有關文件類型定義 (DTD)、資料簡化 XML (XDR) 和 XML 結構定義語言 (XSD) 結構描述驗證錯誤的資訊。
不過,如果不提供 ValidationEventHandler,你依然可以使用通用的異常處理機制來捕捉錯誤。當發生分析錯誤時,將通過引發 XmlException 報告錯誤。如果發生驗證錯誤,將引發 XmlSchemaException。當然,任何一種異常,將無法重新啟動 XmlValidatingReader。
指定事件及回調用遵循通用的做法:通過+=將XmlValidatingReader與事件處理常式ValidationEventHandler串連起來:
vReader.ValidationEventHandler+=new ValidationEventHandler(vCallback);
參數vCallback是回調處理常式的方法名稱,這個方法必須包含一個ValidationEventArgs類型的參數,ValidationEventArgs 類具有針對以下各項的屬性:簡訊,表示 Error 或 Warning 的 XmlSeverityType 枚舉,以及包含與特定驗證錯誤關聯的 XmlSchemaException 資訊的異常。
:
private void vCallback(object sender,ValidationEventArgs args)
{
//發生錯誤時的處理代碼
}
這一步不是必須的,如果你能保證錯誤不會發生或者發生就發生去吧!
6、執行驗證讀操作
做完以上準備工作後,你可以使用XmlValidatingReader類的讀方法開始驗證讀取Xml文檔了。可以是 Read、ReadInnerXml、ReadOuterXml 中的任一種以及其他將改變接點的方法,如Skip()方法。這時,都將發生驗證。
While(vReader.Read())
{
//處理讀取的內容
}
三、執行個體
綜合以上知識,下面建立一個Windows Console控制台應用程式,用於在商務領域中處理產品資料,一般地,不同公司產品資料將遵循一定的格式,這裡通過XSD
Xsd,該架構檔案對xml文檔提供結構資訊,用於在資料交換時遵循一致的標準
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema id="Products" targetNamespace="http://www.tuha.net" elementFormDefault="qualified"
xmlns="http://www.tuha.net" xmlns:mstns="http://www.tuha.net"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Products" type="a1"></xs:element>
<xs:complexType name="b1">
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Type" type="xs:string" />
<xs:element name="Usefor" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="a1">
<xs:sequence maxOccurs="unbounded">
<xs:element name="Item" type="b1" />
</xs:sequence>
</xs:complexType>
</xs:schema>
根據上面的架構檔案,下面構造了一個產品資料xml文檔,這裡使用了產品庫內容的部分段落,為方便測試,讓它成為了一個完整的xml文檔:
<?xml version="1.0" encoding="utf-8" ?>
<Products xmlns="http://www.tuha.net">
<Item>
<Name>Talking Online</Name>
<Type>Fittings</Type>
<Usefor>Communicate</Usefor>
</Item>
<Item>
<Name>Debugging Online</Name>
<Type>Professional</Type>
<Usefor>Machine</Usefor>
</Item>
</Products>
下面的應用程式對xml文檔進行處理,並驗證其資料是否是符合該架構的有效!
using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;
namespace MyXmlValidationgReader
{
class Class1
{
static bool sign=true;
[STAThread]
static void Main(string[] args)
{
XmlTextReader xtr=null;
XmlValidatingReader xvr=null;
string xmlFile="../../Products.xml";//xml來源文件
string xsdFile="../../Products.xsd";//xsd架構文檔
xtr=new XmlTextReader(xmlFile);//構造非驗證讀取器
XmlSchemaCollection xsc=new XmlSchemaCollection();//構造Schema架構快取
xsc.Add("http://www.tuha.net",xsdFile);//在緩衝中添加架構檔案及對應名字空間
xvr=new XmlValidatingReader(xtr);//構造驗證讀取器
xvr.Schemas.Add(xsc);//關聯驗證讀取器與架構集合
xvr.ValidationType=ValidationType.Schema;//設定驗證類型為Schema架構
xvr.ValidationEventHandler+=new ValidationEventHandler(vCallback);
//發生錯誤時的事件處理常式
while(xvr.Read())//執行讀操作
{
}
Console.Write("Finished! "+sign.ToString());
}
private static void vCallback(object sender,ValidationEventArgs args)
//錯誤回調程式
{
sign=false;//改變標記
}
}
}
參考資料:《Xml進階編程》、《Xslt進階編程》、MSDN