正則表達式與Xml方式解釋模板

本篇文章主要是自己項目中遇到問題的總結,即標籤的解釋方式及所採用解釋方式的速度。希望能夠給自己進行靜態生成處理的因爲速度問題而發難朋友們一個提示。

常用的模板解釋生成方式主要用自定義標籤的方式來實現,標籤從原來的大家認識最簡單的替換詞進行替換,再到解釋一系統的函數標籤,即列表標籤。
生成靜態文件中常用的列表標籤類似於
{#Function Type="Article" name="" Lable="" Para1="" Para2="" #}
解釋時用正則表達式得到要求解釋文章列表,然後實例化一個文章解釋類,進行解釋。
調用文章解釋類進行解釋時,需要將字符串中對應的參數付到類對像中,這裏採用的是一種正則表達式的方式。根據對像的屬性進行反射,然後進行查找,如果找到則替換對應的值
方法如下:
//#region 設置給定類的屬性值
///// <summary>
///// 設置對應類的屬性字段
///// </summary>
///// <param name="str">參數字符串</param>
///// <param name="o">要求傳入設置屬性的對像</param>
//public static void SetPara(string str, object o)
//{
//    try
//    {
//        Type t = o.GetType();
//        PropertyInfo[] properties = t.GetProperties();

//        for (int i = 0; i < properties.Length; i++)
//        {
//            string reg_para ="(([;]?//s+))"+ properties[i].Name.ToString() + "=//s*([^;])*//s*([;]?)//s*"; //@"Id=/s*([^;]|^[#}])*/s*([;|#}]?)/s*";
//            Regex mRegex = new Regex(reg_para, (RegexOptions.IgnoreCase | RegexOptions.Compiled));
//            Match mMatch = mRegex.Match(str);
//            if (mMatch.Success)
//            {
//                string value = mMatch.Value;
//                Regex regReplace = new Regex(properties[i].Name + "=", RegexOptions.IgnoreCase);
//                value = regReplace.Replace(value, "");
//                value = value.Replace(";", "");
//                value = value.Replace("#}", "").Trim();
//                properties[i].SetValue(o, value, null);
//            }
//        }
//    }
//    catch (Exception e)
//    {
//        throw (e);
//    }
//}
//#endregion

以上代碼不是因爲錯誤被我註釋,而是因爲解釋速度讓我有一種失落感,太慢,每解釋十個這樣的標籤需要時間大約8秒鐘
這樣每一模板至少需要解釋四十來個這樣的標籤,再加進行數據庫的讀取,字符串運算等相關解釋。即生成一篇文章需要50秒種,而且因爲正則表達式的過多使用,在生成時一般會造成Cpu佔用率很高

通過發現
{#Function Type="Article" name="" Lable="" Para1="" Para2="" #}
變成
<Function Type="Article" name="" Lable="" Para1="" Para2="" />
這種Xml結點形式。只需要進行兩次字符串替換操作。

這樣就可以通過XmlDocument 中Attribute來獲得相關標籤參數的值。
遞歸獲取Xml節點中的屬性到一個Hastable中的速度是很快的
代碼如下:
#region 設置給定類的屬性值
/// <summary>
/// 作者:熊祥衆
/// 日期:2008-10-10
/// 功能:設置給定類的屬性值,通過{# type="" name="" #}方式的字符串給給定的對像付值
/// 版本:V2.0
/// </summary>
/// <param name="str">標籤字符串</param>
/// <param name="o">要求付值的對像</param>
public static void SetPara(string str, object o)
{
    try
    {
 str = FormatIdentifier(str);
 XmlDocument document = new XmlDocument();
 document.LoadXml(str);
 System.Collections.Generic.Dictionary<string, string> list = new Dictionary<string, string>();
 foreach (XmlAttribute attribute in document.FirstChild.Attributes)
 {
     list[attribute.Name.ToLower()] = attribute.Value;
 }
 document = null;
 Type t = o.GetType();
 PropertyInfo[] properties = t.GetProperties();
 for (int i = 0; i < properties.Length; i++)
 {
     string value = "";
     list.TryGetValue(properties[i].Name.ToLower(), out value);
     properties[i].SetValue(o, value, null);
 }
 
    }
    catch (Exception e)
    {
 throw (e);
    }
}
#endregion

經過測試,發現進行2萬次這種操作,同樣也是使用反射但是隻用了8秒鐘

以前只知道正則表達式慢,但是沒有認真考慮過適當的採用Xml方式來解決一些特定問題,這回終於明白了,文章寫得不夠好,
但希望大家得多考慮採用更多的方式去解決問題,而不是採用已知的,但是效率並不高的方式來解決問題。


 

發佈了39 篇原創文章 · 獲贊 12 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章