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验证失败。

转载于:https://www.cnblogs.com/millen/archive/2009/02/18/1393420.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值