小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Xml文檔驗證—編程篇

 diamond 2007-09-04
Xml文檔驗證—編程篇
作者:宋華 時間:2006-09-30 13:12 出處:ccidnet.com 責編:月夜寒簫
              摘要:Xml文檔驗證—編程篇
一、MSXML解析器及.Net程序集對Xml驗證的支持

  XML規(guī)范不僅描述了Xml數(shù)據(jù)的格式和語法,而且為處理Xml數(shù)據(jù)指定了一個兩層的用戶體系結構。第一層是Xml解析器(也被稱為Xml處理程序)。XML解析器負責檢查一個Xml文檔,確保文檔是格式正確的。當Xml文檔有一個相關的dtd或者模式XDR或者架構Schema時,解析器也要確保文檔時有效的。Xml解析器的行為可以定義為試圖減輕應用程序處理xml數(shù)據(jù)的負擔,同時把Xml數(shù)據(jù)的內(nèi)容和結構以規(guī)定的方式送到第二層(Xml應用層)。

  MSXML3就是一個我們曾常使用的解析器。msXml3解析器執(zhí)行前面提到的所有檢查。如果你使用過MSXML3,你可能已經(jīng)對使用validateOnParse屬性或者validate()方法來根據(jù)DTD或者XDR schema驗證Xml文檔非常熟悉。有了validateOnParse屬性,一個文檔在解析成DOM結構時會被驗證,而validate()方法則允許對一個已經(jīng)被解析并裝載完的文檔進行運行時驗證。

  對于Asp.net,微軟構造了一個全新的、基于程序集的解析器以取代MSXML3,這個程序集在System.Xml名字空間中實現(xiàn),該名字空間與同.Net框架一起安裝的System.Xml集相關聯(lián)。要使用.net框架的Xml功能,只需要在工程中引用System.Xml名字空間。

  Asp.net依靠System.Xml集進行Xml解析,程序集中豐富的類、接口等對象及其方法、屬性等為操作xml及其相關技術(規(guī)范)提供了強大的支持。使用.Net支持的多種程序語言(Visual C#、VB.Net等),可以很容易地對Xml文檔執(zhí)行XMLDR schema 或者W3C Xml Schema 驗證,而且,驗證方式變得更加強大而靈活。。

  雖然你仍然可以在.Net語言中調(diào)用MSXML3,但這樣做將無法充分發(fā)揮.Net的強大功能。

 

二、使用XmlValidatingReader類驗證讀取Xml文檔

   .Net程序集System.Xml包含了許多類,這些類用于在.Net平臺上提供Xml功能。 XmlValidatingReader類(XmlReader類的一種實現(xiàn))就是其中的一種。在將xml文檔或Xml片段讀入系統(tǒng)時,該類提供驗證支持。它實現(xiàn) DTD、XML 數(shù)據(jù)簡化 (XDR) 架構和 XML 架構定義語言 (XSD) 架構等規(guī)范所定義的有效性約束。

  1、構造XmlValidatingReade類對象實例

  初始化XmlValidatingReader類的新實例有多種方法,最常用的一種是傳入XmlReader類型的參數(shù):

public XmlValidatingReader( XmlReader reader);
                                    XmlValidatingReader vReader=new XmlValidatingReader(XmlTextReader xtr);

  作為XmlReader的具體實現(xiàn)之一,XmlTextReader類提供對Xml文檔的快速、只前進、無緩存的讀取,而XmlValidatingReader可以使用從XmlTextReader所返回的所有內(nèi)容,并進一步提供驗證支持。當然,如果一切正常,該過程不會造成信息丟失,從給定的 XmlReader 返回的所有節(jié)點和屬性也都從此驗證讀取器返回。未從基礎讀取器返回的新節(jié)點可能由此讀取器添加(例如,實體引用的默認屬性和子級)。

  2、指定驗證類型

  從前面已經(jīng)能知道,有三種規(guī)范用于對xml文檔執(zhí)行驗證。它們是DTD、XDR及XmlSchema。所以,在執(zhí)行驗證之前,需要確定驗證的類型,這通過設置ValidatingReader類的ValidationType屬性來完成:

vReader.ValidationType=ValidationType.Schema.

  這行代碼將驗證聲明為XSD Schema。

  3、使用XmlSchemaCollection類緩存架構

  如果需要根據(jù)XDR或者XSD Schema進行驗證,可以使用XmlSchemaCollection類來緩存架構,這樣將可以提高性能。XmlSchemaCollection類的Add方法加載架構,同時,架構會與命名空間 URI 關聯(lián)。對于"XML 架構"的源文件(.xsd)來說,這通常會是架構的 targetNamespace 屬性。

XmlSchemaCollection xsc=new XmlSchemaCollection();
                                    Xsc.Add("http://www.","vschema.xsd");

  當然,如果架構內(nèi)聯(lián)于Xml文檔中,就不需要這樣做了。

  4、關聯(lián)架構緩存

  在向XmlSchemaCollection中添加完schema之后,XmlValidatingReader并不能自動識別并使用schema,還需要將兩者關聯(lián)起來。通過使用讀取器的 Schemas 屬性引用緩存在 XmlSchemaCollection 中的架構文件來完成這一過程:

vReader.Schemas.Add(xsc);

  5、ValidationEventHandler事件處理程序回調(diào)

  在使用ValidatingReader執(zhí)行驗證讀取Xml文檔時,可能發(fā)生意外。這時,可以通過ValidationEventHandler 回調(diào)報告驗證錯誤和警告。ValidationEventHandler 事件用于設置一個事件處理程序以接收有關文檔類型定義 (DTD)、數(shù)據(jù)簡化 XML (XDR) 和 XML 架構定義語言 (XSD) 架構驗證錯誤的信息。

不過,如果不提供 ValidationEventHandler,你依然可以使用通用的異常處理機制來捕捉錯誤。當發(fā)生分析錯誤時,將通過引發(fā) XmlException 報告錯誤。如果發(fā)生驗證錯誤,將引發(fā) XmlSchemaException。當然,任何一種異常,將無法重新啟動 XmlValidatingReader。

指定事件及回調(diào)用遵循通用的做法:通過+=將XmlValidatingReader與事件處理程序ValidationEventHandler連接起來:

vReader.ValidationEventHandler+=new ValidationEventHandler(vCallback);

  參數(shù)vCallback是回調(diào)處理程序的方法名稱,這個方法必須包含一個ValidationEventArgs類型的參數(shù),ValidationEventArgs 類具有針對以下各項的屬性:文本消息,表示 Error 或 Warning 的 XmlSeverityType 枚舉,以及包含與特定驗證錯誤關聯(lián)的 XmlSchemaException 信息的異常。

:
                                    private void vCallback(object sender,ValidationEventArgs args)
                                    {
                                    //發(fā)生錯誤時的處理代碼
                                    }

  這一步不是必須的,如果你能保證錯誤不會發(fā)生或者發(fā)生就發(fā)生去吧!

  6、執(zhí)行驗證讀操作

  做完以上準備工作后,你可以使用XmlValidatingReader類的讀方法開始驗證讀取Xml文檔了??梢允?Read、ReadInnerXml、ReadOuterXml 中的任一種以及其他將改變接點的方法,如Skip()方法。這時,都將發(fā)生驗證。

While(vReader.Read())
                                    {
                                    //處理讀取的內(nèi)容
                                    }

 

 

三、實例

  綜合以上知識,下面創(chuàng)建一個Windows Console控制臺應用程序,用于在商務領域中處理產(chǎn)品數(shù)據(jù),一般地,不同公司產(chǎn)品數(shù)據(jù)將遵循一定的格式,這里通過XSD

Xsd,該架構文件對xml文檔提供結構信息,用于在數(shù)據(jù)交換時遵循一致的標準

<?xml version="1.0" encoding="utf-8" ?>
                                    <xs:schema id="Products" targetNamespace="http://www." elementFormDefault="qualified"
                                    xmlns="http://www." xmlns:mstns="http://www."
                                    xmlns:xs="http://www./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>

  根據(jù)上面的架構文件,下面構造了一個產(chǎn)品數(shù)據(jù)xml文檔,這里使用了產(chǎn)品庫內(nèi)容的部分段落,為方便測試,讓它成為了一個完整的xml文檔:

<?xml version="1.0" encoding="utf-8" ?>
                                    <Products xmlns="http://www.">
                                    <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>

  下面的應用程序?qū)ml文檔進行處理,并驗證其數(shù)據(jù)是否是符合該架構的有效的!

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.",xsdFile);//在緩存中添加架構文件及對應名字空間
                                    xvr=new XmlValidatingReader(xtr);//構造驗證讀取器
                                    xvr.Schemas.Add(xsc);//關聯(lián)驗證讀取器與架構集合
                                    xvr.ValidationType=ValidationType.Schema;//設置驗證類型為Schema架構
                                    xvr.ValidationEventHandler+=new ValidationEventHandler(vCallback);
                                    //發(fā)生錯誤時的事件處理程序
                                    while(xvr.Read())//執(zhí)行讀操作
                                    {
                                    }
                                    Console.Write("Finished! "+sign.ToString());
                                    }
                                    private static void vCallback(object sender,ValidationEventArgs args)
                                    //錯誤回調(diào)程序
                                    {
                                    sign=false;//改變標記
                                    }
                                    }
                                    }

  參考資料:《Xml高級編程》、《Xslt高級編程》、MSDN

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多