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