[C#] 透過DTD 驗證XML 完整性
2012-11-03
解別人問的問題,可不可以透過C# 來驗證某一份XML 是否符合DTD 的規範,
已經給他範例 http://msdn.microsoft.com/en-us/library/z2adhb2f.aspx
但是他說他要在一個function 內做完,因為生命週期的關係,最後非常懶得包Class 來做..
最後用這樣的解法…
順帶一提: (DTD)是一種可定義合法的XML文檔構建模塊。它使用一系列合法的元素來定義文檔的結構。
所以簡單的說DTD 可以用來驗證一個XML 是否是自己要的文法
sample.xml (XML Sample) :
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE note SYSTEM "valid.dtd">
<note>
<to>許當麻</to>
<from>點部落</from>
<heading>標頭</heading>
<body>測試內容</body>
</note>
此文件其中提到,他驗證必須透過valid.dtd
valid.dtd
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
此案例來源 http://www.wyppt.com/dtd/dtd_intro.html
驗證的Mehod :
/// <summary>
/// 驗證是否符合DTD規範的XML文件
/// </summary>
/// <param name="xmlPath"> 該xml 文檔位置</param>
/// <returns></returns>
public bool IsValidXML(string xmlPath)
{
var xmlReaderSettings = new XmlReaderSettings();
//如果設定為Igonre就會不驗證DTD 指驗證XML 的完整性
// xmlReaderSettings.DtdProcessing = DtdProcessing.Ignore;
xmlReaderSettings.DtdProcessing = DtdProcessing.Parse;
//設定為DTD psrse
xmlReaderSettings.ValidationType = ValidationType.DTD;
xmlReaderSettings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings;
XmlReader reader = XmlReader.Create(xmlPath, xmlReaderSettings);
try
{
while (reader.Read()) ;
}
catch
{
return false;
}
finally
{
//記得關閉免得被lock
reader.Close();
}
return true;
}
其中廢話一下,如果將 DtdProcessing 設成 DtdProcessing.Ignore
他就只會驗證xml文檔是不是 well-formed 也就是你的<element></element> 是不是乖乖地寫有沒有缺字
如果設定為 DtdProcessing.Parse 就必須要是 Valid 過DTD 的文檔不會丟出Exception
呼叫方式 :
protected void Button1_Click(object sender, EventArgs e)
{
if (IsValidXML(Server.MapPath("sample.xml")))
{
Response.Write("Success");
}else
{
Response.Write("Error");
}
}
紀錄一下,給有遇到需求的人