摘要:XML可作为行业内数据交换的标准表示。XML文档的有效性验证是检查该文档是否遵循行业规定的XML文档格式。在进行数据交换时,首先必须对XML文档表示的数据进行有效性验证。文中主要讨论.NET框架下利用XML Schema对XML文档进行有效性验证的算法。
关键词:XML;XML Schema;有效性验证;.NET框架
中图分类号:TP301 文献标识码:A文章编号:1009-3044(2007)03-10638-03
1 引言
XML文档可以表示结构化数据,XML的一个主要目的是允许在组织和应用程序之间自由交换结构化的数据。为此,必须首先定义用于交换信息的XML文档格式,并达成一致。用于数据交换的XML文档首先必须是结构良好的,还需要确保该文档是有效的,也就是该文档要严格遵循已达成一致的结构、业务逻辑和规则。在进行数据交换时,首先要对XML文档进行有效性验证。本文讨论利用XML Schema对XML文档表示的数据进行有效性验证,并给出了在.NET框架下用C#实现的算法。
2 XML Schema简介
通常首先要定义一个模式用于验证XML文档。定义XML文档结构最初的解决方案是使用已有的Document Type Definition(DTD)语法,但是,人们不久就认识到,DTD的限制非常多,它们不支持强数据类型,也不能扩展,只能根据元素的顺序和频率进行了非常有限的验证。同时,由于DTD是用不同于XML的语言写成的,需要不同的分析器来分别处理DTD和XML文档本身。另外,由于DTD的语法也相对复杂和古怪,不大易用,所以,又产生了XML Schema。
XML Schema Definition(XSD)语言由W3C引入,作为DTD的替代品,XML Schema克服了DTD的所有缺点,与DTD相比,XML Schema具有以下优点:XML Schema基于XML,没有专门的语法;XML Schema支持一系列的数据类型(int,float,boolean,date等等);XML Schema提供可扩充的数据模型,它允许扩充词表并在没有无效文件的情况下确定元素之间的关系;XML Schema利用名域空间(Namespace)将文档中的特殊节点与Schema说明相联系。
为便于说明问题,下面我们给出一个XML文档,它包含了有关报纸文章的信息。
为验证上述示例文档,我们可建立如下的XSD文档,关于XML Schema如何建立不是本文的讨论重点,此处不加以详述:
3 XML文档有效性验证
下面介绍在微软.NET Framework下用C#具体实现对XML文档的有效性验证。.NET Framework提供了用于验证XML文档的XmlValidatingReader类。XmlValidatingReader继承于XmlReader类,该类通过实现 W3C 建议所定义的有效性约束来提供 DTD、数据简化 XML (XDR) 和 XML 架构定义语言 (XSD) 架构验证服务。XmlValidatingReader 类实现 XmlReader 类,并以只进方式对 XML 流执行验证。
本文原文
这里,我们将XML有效性验证的算法封装成一个类ValidateXML,因此首先在VS.NET中添加一个类库项目,在该项目中添加一个ValidateXML类。.NET Framework中,与Xml和Xml Schema相关的类集中在System.Xml和System.Xml.Schema命名空间中,所以必须在程序开头用using语句把这两个命名空间包含进来。然后,按下列步骤建立ValidateXML类:
步骤1 创建一个XmlValidatingReader对象。
我们在上述ValidateXML类中添加一个方法Validate(),该方法读取XML文档并进行验证,其形式如下所示,其中xmlFile是xml文档名,xmlSchemaFile是XSD架构文件名,在验证成功时,返回true,否则返回false。为了获取验证状态,在类中定义一个类成员变量success。
private bool success;
public bool Validate(string xmlFile,string xmlSchemaFile,string xmlns)
为读取并验证XML文档,常用的方法是,首先创建一个XmlTextReader对象,通过它读取XML文档,XmlTextReader对象不具有任何验证功能,因此需要创建一个XmlValidatingReader对象,并将它与XmlTextReader建立关联,执行验证功能。将下面这段代码加入Validate()方法的开始部分:
success=true;
//建立XmlTextReader对象,该对象读取XML文档
XmlTextReader xt=new XmlTextReader(xmlFile);
//建立ValidatingReader对象,与前面的XmlTextReader对象相关联
XmlValidatingReader xv=new XmlValidatingReader(xt);
步骤2 建立模式缓存。
.NET Framework包含一个XmlSchemaCollection类,该类允许在内存中对Schema建立缓存,而不要每次都重新加载它们来验证一个文档。这可以改进运行时性能,特别是如果有许多XML文档需要进行验证时。
将以下代码加入到上面Validate()方法中。这段代码从磁盘读取XML Schema文件,并加载到一个XmlSchemaCollection对象中,然后将该XmlSchemaCollection对象加载到XmlValidatingReader的Schemas属性中。该属性是模式的XmlSchemaCollection,在验证时被XmlValidatingReader所用。
//读取用于验证的Schema文件并添加到XmlValidatingReader对象的模式缓存中
XmlSchemaCollection xs = new XmlSchemaCollection();
xs.Add(null, new XmlTextReader(xmlSchemaFile));
xv.Schemas.Add(xs);
步骤3 注册验证事件处理程序方法。
验证事件处理程序方法接收有关验证错误的通知。将以下代码加入Validate()方法。这段代码注册了一个名为ValidationErrorProcess的事件处理程序方法,后面我们将实现该方法。
//注册验证事件处理程序方法
xv.ValidationEventHandler+=new ValidationEventHandler(ValidationErrorProccess);
步骤4 读取和验证文档。
使用XmlValidatingReader对象的Read()方法来读取XML文档的内容。每次调用Read()方法时,将得到文档中的下一个节点。在读取过程中,XmlValidatingReader将验证XML文档,并报告所检测到的任意验证错误。当有验证错误时,调用验证事件处理程序方法,并将有关验证错误信息作为其参数。在某些情况下可能出现一个XmlException异常,例如一个丢失的XML文档或模式等。因此,应该将代码包含在一个try…catch块之中,从而能在异常发生时捕获XmlException事件。当读到文档结尾时,Read()方法返回false。此时,应该关闭这个XmlValidatingReader对象。
将以下代码加入Validate()方法中。这段代码使用Read()方法来读取整个XML文档的内容。在读取过程中,XmlValidatingReader将验证整个XML文档。整个代码都被包含在一个try…catch块中。注意,我们在finally块中关闭XmlValidatingReader,这也将自动关闭潜在的XmlTextReader:
try{
//读取并验证XML文档
while(xv.Read()){}}
catch{
success=false;//此处可添加对XmlException异常的处理}
finally {
xv.Close();}
return success;
至此,Validate()方法代码全部写完,下面编写验证事件处理程序方法代码。
步骤5 实现验证事件处理程序方法。
验证事件处理程序方法用来处理遍历XML文档时XmlValidatingReader检测到的任意验证错误。在ValidateXML类中添加下列方法ValidationErrorProcess(),其形式如下所示,该方法名必须与步骤3注册的方法名相同,且事件参数必须为ValidationEventArgs类型。
private void ValidationErrorProcess(object sender, ValidationEventArgs args)
将以下代码加入到ValidationErrorProcess()方法中。这里,我们在只是简单地将类成员变量success设置为false,表示XML文档不是有效的。
success=false; //此处可加入对验证错误的处理程序
至此,整个ValidateXML类设计完成。
4 应用实例
这里,我们通过一个简单的实例来介绍上述实现的ValidateXML类的应用。
首先,分别建立上面示例中给出的XML文档和XML Schema文档,并存储在磁盘中。假设我们将它们分别存储为c:/article.xml和c:/newsarticle.xsd中。
在VS.NET中添加一个Windows应用程序项目,在该项目中添加对上面建立的类库项目的引用。然后,设计一个窗体,并将下面的代码添加到按钮的Click事件处理程序中。这段代码创建了一个ValidateXML对象,并利用该对象的Validate()方法对指定的XML文档进行验证,并将验证结果通过Label控件lblResult显示出来。
我们可以修改XML文档,使之有效或者变得不再有效,从多个方面来进行实验,来检查应用程序能否检测到验证错误。
private void button1_Click(object sender, System.EventArgs e)
{lblResult.Text="";
ValidateXML.ValidateXML validateXml=new ValidateXML.ValidateXML();
if(validateXml.Validate("c://article.xml","c://newsarticle.xsd"))
lblResult.Text="Validation Success!";
else
lblResult.Text="File Not Exists or Validation Fail!";}
5 结束语
本文详细地论述了.NET Framework下应用XML Schema对XML文档表示的数据进行有效性验证的方法,并建立了相应类库,读者可以直接按本文介绍的方法加以应用。数据的有效性验证在基于XML的数据交换应用中是必不可少的一步,因此应用相当广泛。
基于XML Schema的数据有效性验证
最新推荐文章于 2019-03-25 21:21:46 发布