C#高级编程之处理XML-连载七

时间:2010年04月12日 点击:160

23.5.2  使用XmlValidatingReader

如果要验证XML文档的有效性,就需要使用XmlValidatingReader,它的功能与XmlTextReader相同(它们都扩展了XmlReader),但XmlValidatingReader增加了ValidationType属性、Schemas属性和SchemaType属性。

ValidationType属性设置为要进行有效性验证的类型。这个属性的有效值如表23-3所示。

  23-3

   

    

Auto

如果在<!DOCTYPE…>声明中声明了DTD,就加载和处理该DTD。在DTD中定义的默认属性和一般实体是可用的

如果找到了一个XSD schemalocation属性,就加载和处理XSD,并返回在该模式中定义的默认属性   

如果找到了带有MSXML x-schema:前缀的命名空间,就加载和处理XDR模式,返回定义的默认属性

DTD

根据DTD规则进行有效性验证

Schema

根据XSD模式进行有效性验证

XDR

根据XDR模式进行有效性验证

None

不执行任何有效性验证

 

 

设置好属性后,就需要指定ValidationEventHandler。在发生有效性验证错误时,就要引发一个事件,然后以合适的方式对该错误进行响应。

下面的示例说明了响应错误的方式。首先在books.xml文件中添加一个XDR (XML Data Reduced)模式命名空间,并把该文件重新命名为booksVal.xml,现在该文件应如下所示:

<?xml version='1.0'?>

<!-- This file represents a fragment of a book store inventory database -->

<bookstore xmlns="x-schema:books.xdr">

   <book genre="autobiography" publicationdate="1981" ISBN="1-861003-11-0">

      <title>The Autobiography of Benjamin Franklin</title>

      <author>

         <first-name>Benjamin</first-name>

         <list-name>Franklin</last-name>

      </author>

      <price>8.99</price>

   </book>

   ...

</bookstore>

注意,bookstore元素现在拥有属性xmlns="x-schema:books.xdr",指向XDR模式books.xdr

<?xml version="1.0"?>

<Schema xmlns="urn:schemas-microsoft-com:xml-data"

        xmlns:dt="urn:schemas-microsoft-com:datatypes">

   <ElementType FTEL="first-name" content="textOnly"/>

   <ElementType FTEL="last-name" content="textOnly"/>

   <ElementType FTEL="name" content="textOnly"/>

   <ElementType FTEL="price" content="textOnly" dt:type="fixed.14.4"/>

   <ElementType FTEL="author" content="eltOnly" order="one">

      <group order="seq">

         <element type="name"/>

      </group>

      <group order="seq">

         <element type="first-name"/>

         <element type="last-name"/>

      </group>

   </ElementType>

   <ElementType FTEL="title" content="textOnly"/>

   <AttributeType FTEL="genre" dt:type="string"/>

   <ElementType FTEL="book" content="eltOnly">

      <attribute type="genre" required="yes"/>

      <element type="title"/>

      <element type="author"/>

      <element type="price"/>

   </ElementType>

   <ElementType FTEL="bookstore" content="eltOnly">

      <element type="book"/>

   </ElementType>

</Schema>

现在一切都很顺利,但XML文件上还有两个没有在模式上定义的属性(book元素的属性publicationdateISBN)。把这些属性添加进去,通过引发一个有效性验证错误,说明确实进行了有效性验证,可以使用下面的代码(XMLReaderSample5)进行验证。

首先还需要在类中添加:

using System.Xml.Schema;

接着在按钮的事件处理程序中添加如下代码:

protected void button1_Click (object sender, System.EventArgs e)

{

   //change this to match your path structure.

   string fileName = "..\\..\\..\\booksVal.xml";

   XmlTextReader tr=new XmlTextReader(fileName);

   XmlValidatingReader trv = new XmlValidatingReader(tr);

 

   //Set validation type

   trv.ValidationType=ValidationType.XDR;

   //Add in the Validation eventhandler

   trv.ValidationEventHandler +=

                      new ValidationEventHandler(this.ValidationEvent);

 

   //Read in node at a time       

   while(trv.Read()) 

   {

      if(trv.NodeType == XmlNodeType.Text)

      listBox1.Items.Add(trv.Value);

   }

}

public void ValidationEvent (object sender, ValidationEventArgs args)

{

   MessageBox.Show(args.Message);

}

创建XmlTextReader,并把它传送给XmlValidatingReader。创建好XmlValidatingReader(trv)后,就可以用前面示例中使用XmlTextReader的方式使用它。区别是指定ValidationType,并添加一个ValidationEventHandler。可以用合适的方式处理有效性验证错误。在本例中,用一个消息框显示错误

与一些分析器不同,一旦出现有效性验证错误, XmlValidatingReader仍会继续读取数据。如果可以确定它是一个严重错误,就应停止读取数据,处理该错误。

使用Schemas属性

XmlValidatingReaderSchemas属性包含一个XmlSchemaCollection,它在命名空间System.Xml.Schema中。这个集合包含预先加载的XSDXDR模式,以进行非常快速的有效性验证,特别适合于验证几个文档的情况,因为在每次进行有效性验证时,不需要重新加载该模式。为了利用这个性能,要创建一个XmlSchemaCollection对象。Add()方法用于填充XmlSchemaCollection对象,它有4个重载方法,它们的参数分别是基于XmlSchema的对象、基于XmlSchemaCollection的对象、一个带有namespace的字符串和包含模式文件的URI的字符串,最后是一个带namespace的字符串和一个包含模式的基于XmlReader的对象。

更多DotNet好文章www.zdexe.com

赞助商链接

热门内容

相关内容

联系我们

联系方式