XML校验之三

目前,如果将数据保存在XmlDocument对象中,那么惟一可以执行的验证类型是载入期(load-time)验证。可以通过将诸如XmlReader对象的验证读取器对象传入Load方法中来实现。但是,如果您做了任何修改,那就无法保证数据依然符合当初的模式了。通过使用XmlNodeReader类读取保存在XmlNode对象中的数据,就可以将XmlNodeReader传入Create方法来验证DOM对象了。程序清单5-5显示了一个如何完成这项工作的示例。

程序清单5-5  执行XML DOM验证

<%@ Page Language="C#"%>

<%@ Import Namespace="System.Xml" %>

<%@ Import Namespace="System.Xml.Schema" %>

<script runat="server">

  private StringBuilder _builder = new StringBuilder();

  void Page_Load(object sender, EventArgs e)

  {

    string xmlPath = Request.PhysicalApplicationPath +

      @""App_Data"Authors.xml";   

    string xsdPath = Request.PhysicalApplicationPath +

      @""App_Data"Authors.xsd";

    XmlDocument xmlDoc = new XmlDocument();

    xmlDoc.Load(xmlPath);

    XmlElement authorElement = (XmlElement)

    xmlDoc.DocumentElement.SelectSingleNode

      ("//authors/author[au_id='172-32-1176']");

    authorElement.SetAttribute("test", "test");

    XmlNodeReader nodeReader = new XmlNodeReader(xmlDoc);

    XmlReader reader = null;       

    XmlReaderSettings settings = new XmlReaderSettings();

    settings.ValidationEventHandler += new

      ValidationEventHandler(this.ValidationEventHandler);

    settings.ValidationType = ValidationType.Schema;       

    settings.Schemas.Add(null, XmlReader.Create(xsdPath));

    reader = XmlReader.Create(nodeReader, settings);

    while (reader.Read())

    {           

    }

    if (_builder.ToString() == String.Empty)

      Response.Write("Validation completed successfully.");

    else

      Response.Write("Validation Failed. <br>" + _builder.ToString());

    }

 

    void ValidationEventHandler(object sender, ValidationEventArgs args)

    {       

      _builder.Append("Validation error: " + args.Message + "<br>");               

    }   

 

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>DOM Validation</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>               

    </div>

    </form>

</body>

</html>

程序清单5-5演示了由XmlDocument对象(Authors.xml文档加载)返回的XmlNodeReader对象如何在读取的时候将XML模式验证支持放置在顶部。

在将XmlDocument对象读入XmlNodeReader对象之前,Authors.xml文件被载入XmlDocument中并通过添加名为“test”的属性而对其进行修改。

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.Load(xmlPath);

XmlElement authorElement = (XmlElement)

xmlDoc.DocumentElement.SelectSingleNode

  ("//authors/author[au_id='172-32-1176']");

authorElement.SetAttribute("test", "test");

然后将XML文档传入XmlNodeReader,再将该对象传入工厂化创建的(factory created)XmlReader对象。

reader = XmlReader.Create(nodeReader, settings);

当验证读取器分析文件的时候,它会验证文件中的任何修改。因为XmlDocument对象中添加了一个无效的属性,XSD模式将会失败并且您将会看到与图5-2类似的输出。

  5-2

正如在图5-2中所看到的,因为修改后的XML数据不符合XSD模式,所以XML验证失败。

posted @ 2009-02-18 19:05  catch22  阅读(588)  评论(0编辑  收藏  举报