2013年8月25日 星期日

[C#] XSD 驗證 XML 實作方式

XSD 為定義 XML 檔案格式的  Schema 文件,用來記載 XML 檔案的結構描述。網路傳輸 XML 資料很常見,因此驗證格式是否正確也是一塊很重要的原件。
C# 微軟官方有提供相關的範例給開發者閱讀,小弟也閱讀幾篇不錯部落格分享的實作,修改而成,分享給大家參考。

class SchemaValidation
    {
        private static bool isValid = true;
 
        ///
        /// 提供 驗證 XML 是否符合 XSD 格式
        ///
        ///XML File Path
        ///XSD File Path
        ///
        public static bool ValidationSchemaNow(string xmlstring, string schemastring)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(xmlstring);
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.ValidationType = ValidationType.Schema;
            settings.Schemas.Add("urn:bookstore-schema", schemastring);
            settings.ValidationEventHandler += new ValidationEventHandler(MyValidationEventHandler);
 
            XmlNodeReader nodeReader = new XmlNodeReader(doc);
            XmlReader xr = XmlReader.Create(nodeReader, settings);
            try
            {
                while (xr.Read()) ;
            }
            catch (Exception e)
            {
                isValid = false;
                WriteErrorLogs("Validation Warning:   " + e.Message);
            }
            finally
            {
                xr.Close();
            }
            return isValid;
        }
 
 
        ///
        /// 驗證處理 Handler
        ///
        private static void MyValidationEventHandler(object sender, ValidationEventArgs args)
        {
            if (args.Severity == XmlSeverityType.Warning)
            {
                WriteErrorLogs("Validation Warning:   " + args.Message);
            }
            else
            {
                WriteErrorLogs("Validation Error:   " + args.Message);
            }
            isValid = false;
        }
 
        ///
        /// 錯誤 log 紀錄
        ///
        private static void WriteErrorLogs(string p)
        {
            StreamWriter sw = null;
            try
            {
                sw = new StreamWriter(@"D:\xml\erro.txt", true, Encoding.UTF8);
                sw.WriteLine("[" + DateTime.Now.ToString() + "]" + p);
                sw.Flush();
                sw.Close();
            }
            catch { sw.Close(); }
        }
}
這個 Class 可以驗證傳入的 XML 格式是否符合 XSD 的定義。但如果 XSD 改變程式中 的 settings.Schemas.Add("urn:bookstore-schema", schemastring); 第一個 String 參數也要跟著抽換的 XSD 檔案而改變。而我就沒有將此另外做改寫。


而呼叫的程式碼如下:


static void Main(string[] args)
       {
           string xmlfilePath = @"D:\xml\bookSchema.xml";
           string xsdfilePath = @"D:\xml\books.xsd";
      
           //利用 XSD 驗證
           if (SchemaValidation.ValidationSchemaNow(xmlfilePath, xsdfilePath))
           {
               // do something
               Console.WriteLine("驗證成功");
           }
           else
           {
               Console.WriteLine("驗證失敗");
           }
           Console.Read();
       }

沒有留言:

張貼留言