[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");
    }
}

 


紀錄一下,給有遇到需求的人


當麻許的超技八 2014 | Donma Hsu Design.