设为首页收藏本站language 语言切换
查看: 1440|回复: 0
收起左侧

Xml文档验证—编程篇

[复制链接]
发表于 2010-2-25 10:29:00 | 显示全部楼层 |阅读模式
<p ><center><font color="#000099"><strong>一、MSXML解析器及.Net程序集对Xml验证的支持</strong></font></center><p >  XML规范不仅描述了Xml数据的格式和语法,而且为处理Xml数据指定了一个两层的用户体系结构。第一层是Xml解析器(也被称为Xml处理程序)。XML解析器负责检查一个Xml文档,确保文档是格式正确的。当Xml文档有一个相关的dtd或者模式XDR或者架构Schema时,解析器也要确保文档时有效的。Xml解析器的行为可以定义为试图减轻应用程序处理xml数据的负担,同时把Xml数据的内容和结构以规定的方式送到第二层(Xml应用层)。 <p >  MSXML3就是一个我们曾常使用的解析器。msXml3解析器执行前面提到的所有检查。如果你使用过MSXML3,你可能已经对使用validateOnParse属性或者validate()方法来根据DTD或者XDR schema验证Xml文档非常熟悉。有了validateOnParse属性,一个文档在解析成DOM结构时会被验证,而validate()方法则允许对一个已经被解析并装载完的文档进行运行时验证。   <p >  对于Asp.net,微软构造了一个全新的、基于程序集的解析器以取代MSXML3,这个程序集在System.Xml名字空间中实现,该名字空间与同.Net框架一起安装的System.Xml集相关联。要使用.net框架的Xml功能,只需要在工程中引用System.Xml名字空间。<p >  Asp.net依靠System.Xml集进行Xml解析,程序集中丰富的类、接口等对象及其方法、属性等为操作xml及其相关技术(规范)提供了强大的支持。使用.Net支持的多种程序语言(Visual C#、VB.Net等),可以很容易地对Xml文档执行XMLDR schema 或者W3C Xml Schema 验证,而且,验证方式变得更加强大而灵活。。<p >  虽然你仍然可以在.Net语言中调用MSXML3,但这样做将无法充分发挥.Net的强大功能。<p ><center><font color="#000099"><strong>二、使用XmlValidatingReader类验证读取Xml文档</strong></font></center><p >    .Net程序集System.Xml包含了许多类,这些类用于在.Net平台上提供Xml功能。 XmlValidatingReader类(XmlReader类的一种实现)就是其中的一种。在将xml文档或Xml片段读入系统时,该类提供验证支持。它实现 DTD、XML 数据简化 (XDR) 架构和 XML 架构定义语言 (XSD) 架构等规范所定义的有效性约束。<p >  1、构造XmlValidatingReade类对象实例<p >  初始化XmlValidatingReader类的新实例有多种方法,最常用的一种是传入XmlReader类型的参数:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>public XmlValidatingReader( XmlReader reader);XmlValidatingReader vReader=new XmlValidatingReader(XmlTextReader xtr);</ccid_code></pre></td></tr></table></ccid_nobr><p >  作为XmlReader的具体实现之一,XmlTextReader类提供对Xml文档的快速、只前进、无缓存的读取,而XmlValidatingReader可以使用从XmlTextReader所返回的所有内容,并进一步提供验证支持。当然,如果一切正常,该过程不会造成信息丢失,从给定的 XmlReader 返回的所有节点和属性也都从此验证读取器返回。未从基础读取器返回的新节点可能由此读取器添加(例如,实体引用的默认属性和子级)。<p >  2、指定验证类型<p >  从前面已经能知道,有三种规范用于对xml文档执行验证。它们是DTD、XDR及XmlSchema。所以,在执行验证之前,需要确定验证的类型,这通过设置ValidatingReader类的ValidationType属性来完成:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>vReader.ValidationType=ValidationType.Schema.</ccid_code></pre></td></tr></table></ccid_nobr><p >  这行代码将验证声明为XSD Schema。<p >  3、使用XmlSchemaCollection类缓存架构<p >  如果需要根据XDR或者XSD Schema进行验证,可以使用XmlSchemaCollection类来缓存架构,这样将可以提高性能。XmlSchemaCollection类的Add方法加载架构,同时,架构会与命名空间 URI 关联。对于"XML 架构"的源文件(.xsd)来说,这通常会是架构的 targetNamespace 属性。<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>XmlSchemaCollection xsc=new XmlSchemaCollection();Xsc.Add(&quot;http://www.tuha.net&quot;,&quot;vschema.xsd&quot;);</ccid_code></pre></td></tr></table></ccid_nobr><p >  当然,如果架构内联于Xml文档中,就不需要这样做了。<p >  4、关联架构缓存<p >  在向XmlSchemaCollection中添加完schema之后,XmlValidatingReader并不能自动识别并使用schema,还需要将两者关联起来。通过使用读取器的 Schemas 属性引用缓存在 XmlSchemaCollection 中的架构文件来完成这一过程:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>vReader.Schemas.Add(xsc);</ccid_code></pre></td></tr></table></ccid_nobr><p >  5、ValidationEventHandler事件处理程序回调<p >  在使用ValidatingReader执行验证读取Xml文档时,可能发生意外。这时,可以通过ValidationEventHandler 回调报告验证错误和警告。ValidationEventHandler 事件用于设置一个事件处理程序以接收有关文档类型定义 (DTD)、数据简化 XML (XDR) 和 XML 架构定义语言 (XSD) 架构验证错误的信息。<p >不过,如果不提供 ValidationEventHandler,你依然可以使用通用的异常处理机制来捕捉错误。当发生分析错误时,将通过引发 XmlException 报告错误。如果发生验证错误,将引发 XmlSchemaException。当然,任何一种异常,将无法重新启动 XmlValidatingReader。<p >指定事件及回调用遵循通用的做法:通过+=将XmlValidatingReader与事件处理程序ValidationEventHandler连接起来:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>vReader.ValidationEventHandler+=new ValidationEventHandler(vCallback);</ccid_code></pre></td></tr></table></ccid_nobr><p >  参数vCallback是回调处理程序的方法名称,这个方法必须包含一个ValidationEventArgs类型的参数,ValidationEventArgs 类具有针对以下各项的属性:文本消息,表示 Error 或 Warning 的 XmlSeverityType 枚举,以及包含与特定验证错误关联的 XmlSchemaException 信息的异常。<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>:private void vCallback(object sender,ValidationEventArgs args){//发生错误时的处理代码}</ccid_code></pre></td></tr></table></ccid_nobr><p >  这一步不是必须的,如果你能保证错误不会发生或者发生就发生去吧!<p >  6、执行验证读操作<p >  做完以上准备工作后,你可以使用XmlValidatingReader类的读方法开始验证读取Xml文档了。可以是 Read、ReadInnerXml、ReadOuterXml 中的任一种以及其他将改变接点的方法,如Skip()方法。这时,都将发生验证。<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>While(vReader.Read()){//处理读取的内容}</ccid_code></pre></td></tr></table></ccid_nobr><p ><p ><center><font color="#000099"><strong>三、实例</strong></font></center><p >  综合以上知识,下面创建一个Windows Console控制台应用程序,用于在商务领域中处理产品数据,一般地,不同公司产品数据将遵循一定的格式,这里通过XSD<p >Xsd,该架构文件对xml文档提供结构信息,用于在数据交换时遵循一致的标准<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;&lt;xs:schema id=&quotroducts&quot; targetNamespace=&quot;http://www.tuha.net&quot; elementFormDefault=&quot;qualified&quot;xmlns=&quot;http://www.tuha.net&quot; xmlns:mstns=&quot;http://www.tuha.net&quot;xmlns:xs=&quot;http://www.w3.org/2001/XMLSchema&quot;&gt;        &lt;xs:element name=&quotroducts&quot; type=&quot;a1&quot;&gt;&lt;/xs:element&gt;        &lt;xs:complexType name=&quot;b1&quot;&gt;                &lt;xs:sequence&gt;                        &lt;xs:element name=&quot;Name&quot; type=&quot;xs:string&quot; /&gt;                        &lt;xs:element name=&quot;Type&quot; type=&quot;xs:string&quot; /&gt;                        &lt;xs:element name=&quot;Usefor&quot; type=&quot;xs:string&quot; /&gt;                &lt;/xs:sequence&gt;        &lt;/xs:complexType&gt;        &lt;xs:complexType name=&quot;a1&quot;&gt;                &lt;xs:sequence maxOccurs=&quot;unbounded&quot;&gt;                        &lt;xs:element name=&quot;Item&quot; type=&quot;b1&quot; /&gt;                &lt;/xs:sequence&gt;        &lt;/xs:complexType&gt;&lt;/xs:schema&gt;</ccid_code></pre></td></tr></table></ccid_nobr><p >  根据上面的架构文件,下面构造了一个产品数据xml文档,这里使用了产品库内容的部分段落,为方便测试,让它成为了一个完整的xml文档:<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;&ltroducts xmlns=&quot;http://www.tuha.net&quot;&gt;        &lt;Item&gt;                &lt;Name&gt;Talking Online&lt;/Name&gt;                &lt;Type&gt;Fittings&lt;/Type&gt;                &lt;Usefor&gt;Communicate&lt;/Usefor&gt;        &lt;/Item&gt;        &lt;Item&gt;                &lt;Name&gt;Debugging Online&lt;/Name&gt;                &lt;Type&gtrofessional&lt;/Type&gt;                &lt;Usefor&gt;Machine&lt;/Usefor&gt;        &lt;/Item&gt;&lt;/Products&gt;</ccid_code></pre></td></tr></table></ccid_nobr><p >  下面的应用程序对xml文档进行处理,并验证其数据是否是符合该架构的有效的!<p ><ccid_nobr><table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>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=&quot;../../Products.xml&quot;;//xml源文档        string xsdFile=&quot;../../Products.xsd&quot;;//xsd架构文档        xtr=new XmlTextReader(xmlFile);//构造非验证读取器        XmlSchemaCollection xsc=new XmlSchemaCollection();//构造Schema架构缓存        xsc.Add(&quot;http://www.tuha.net&quot;,xsdFile);//在缓存中添加架构文件及对应名字空间        xvr=new XmlValidatingReader(xtr);//构造验证读取器        xvr.Schemas.Add(xsc);//关联验证读取器与架构集合        xvr.ValidationType=ValidationType.Schema;//设置验证类型为Schema架构        xvr.ValidationEventHandler+=new ValidationEventHandler(vCallback);                      //发生错误时的事件处理程序        while(xvr.Read())//执行读操作        {        }                        Console.Write(&quot;Finished! &quot;+sign.ToString());        }        private static void vCallback(object sender,ValidationEventArgs args)                      //错误回调程序        {        sign=false;//改变标记        }        }}</ccid_code></pre></td></tr></table></ccid_nobr><p >  参考资料:《Xml高级编程》、《Xslt高级编程》、MSDN<p ><p ><center class="name02">(责任编辑 GUIDE)</center><p align="center"></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-12 14:40 , Processed in 0.100091 second(s), 24 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表