乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Xml文檔驗(yàn)證—編程篇

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

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

        MSXML3就是一個(gè)我們?cè)J褂玫慕馕銎鳌sXml3解析器執(zhí)行前面提到的所有檢查。如果你使用過MSXML3,你可能已經(jīng)對(duì)使用validateOnParse屬性或者validate()方法來根據(jù)DTD或者XDR schema驗(yàn)證Xml文檔非常熟悉。有了validateOnParse屬性,一個(gè)文檔在解析成DOM結(jié)構(gòu)時(shí)會(huì)被驗(yàn)證,而validate()方法則允許對(duì)一個(gè)已經(jīng)被解析并裝載完的文檔進(jìn)行運(yùn)行時(shí)驗(yàn)證。

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

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

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

       

      二、使用XmlValidatingReader類驗(yàn)證讀取Xml文檔

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

        1、構(gòu)造XmlValidatingReade類對(duì)象實(shí)例

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

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

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

        2、指定驗(yàn)證類型

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

      vReader.ValidationType=ValidationType.Schema.

        這行代碼將驗(yàn)證聲明為XSD Schema。

        3、使用XmlSchemaCollection類緩存架構(gòu)

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

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

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

        4、關(guān)聯(lián)架構(gòu)緩存

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

      vReader.Schemas.Add(xsc);

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

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

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

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

      vReader.ValidationEventHandler+=new ValidationEventHandler(vCallback);

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

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

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

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

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

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

       

       

      三、實(shí)例

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

      Xsd,該架構(gòu)文件對(duì)xml文檔提供結(jié)構(gòu)信息,用于在數(shù)據(jù)交換時(shí)遵循一致的標(biāo)準(zhǔn)

      <?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ù)上面的架構(gòu)文件,下面構(gòu)造了一個(gè)產(chǎn)品數(shù)據(jù)xml文檔,這里使用了產(chǎn)品庫(kù)內(nèi)容的部分段落,為方便測(cè)試,讓它成為了一個(gè)完整的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>

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

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

        參考資料:《Xml高級(jí)編程》、《Xslt高級(jí)編程》、MSDN

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

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多