如果要验证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元素的属性publicationdate和ISBN)。把这些属性添加进去,通过引发一个有效性验证错误,说明确实进行了有效性验证,可以使用下面的代码(在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仍会继续读取数据。如果可以确定它是一个严重错误,就应停止读取数据,处理该错误。
XmlValidatingReader的Schemas属性包含一个XmlSchemaCollection,它在命名空间System.Xml.Schema中。这个集合包含预先加载的XSD和XDR模式,以进行非常快速的有效性验证,特别适合于验证几个文档的情况,因为在每次进行有效性验证时,不需要重新加载该模式。为了利用这个性能,要创建一个XmlSchemaCollection对象。Add()方法用于填充XmlSchemaCollection对象,它有4个重载方法,它们的参数分别是基于XmlSchema的对象、基于XmlSchemaCollection的对象、一个带有namespace的字符串和包含模式文件的URI的字符串,最后是一个带namespace的字符串和一个包含模式的基于XmlReader的对象。
更多DotNet好文章www.zdexe.com