目前,如果將資料儲存在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驗證失敗。