XML的好處自然有很多,在軟件中用XML可以讓軟件方便的實現多語言版,在數據傳輸中它能夠以很好的組織結構交換信息,同時利用xpath可以方便的解析,在持久化中它能很好的描述業務數據……
本文主要講通過讀取XML配置實現對不同數據實體的統一處理,生成表現table,當然生成div也是可以的。以table為例。
代碼中沒有進行異常處理,請見諒,只是寫出了思路!
XML文件:
<?XML version="1.0" encoding="utf-8" ?>
<ListConfig>
<!-- 項目table的模板一 type標識模板,attribute定義table或者td的屬性,name與數據表的列名對應 -->
<Project type="0" attribute="width='100%'">
<Column name="Sort" attribute="width='35'">類別</Column>
<Column name="ProjectName" attribute="width='100'">項目名稱</Column>
<Column name="StudentNum" attribute="width='40'">學號</Column>
<Column name="Teacher" attribute="width='30'">老師</Column>
<Column name="TeacherDuty" attribute="width='100'">老師責任</Column>
</Project>
<!-- 項目table的模板二 -->
<Project type="1" attribute="">
<Column name="Sort" attribute="width='35'">類別</Column>
<Column name="ProjectName" attribute="width='100'">項目名稱</Column>
<Column name="StudentNum" attribute="width='40'">學號</Column>
<Column name="Teacher" attribute="width='30'">老師</Column>
<Column name="TeacherDuty" attribute="width='100'">老師責任</Column>
<Column name="EduLevel" attribute="width='100'">教育程度</Column>
</Project>
<!-- 項目table的模板三 -->
<Project type="2" attribute="">
<Column name="ProjectName" attribute="width='100'">項目名稱</Column>
<Column name="StudentNum" attribute="width='40'">學號</Column>
<Column name="Teacher" attribute="width='30'">老師</Column>
</Project>
<Article type="0" attribute="">
<Column name="Title" attribute="">標題</Column>
<Column name="Content" attribute="">內容</Column>
<Column name="Author" attribute="">作者</Column>
<Column name="ComeFrom" attribute="">來源</Column>
</Article>
</ListConfig>
Code:
public class ConstructEntityList<T> where T : class, new()
{
private Type tType;
private XmlDocument document = new XMLDocument();
public ConstructEntityList()
{
//獲得要生成的列表對應的實體類型
tType = typeof(T);
//加載配置文件
document.Load(@"D:\PracticeAndTeach\PracticeAndTeach\PATWebSite\Component\ListConfig.XML");
}
/**//// <summary>
/// 獲得實體列表table
/// </summary>
/// <param name="iqueryable">轉換源</param>
/// <param name="type">模板類型</param>
/// <returns>table</returns>
public string GetEntityListString(IQueryable<T> iqueryable, object type)
{
//得到模板的列元素
XMLNodeList list = document.SelectNodes(string.Format("/ListConfig/{0}[@type={1}]/Column",tType.Name, Convert.ToInt32(type)));
StringBuilder listBuilder = new StringBuilder();
//構造table的表頭,並且設置table的屬性
listBuilder.AppendFormat("<table {0} ><tr>",
document.SelectSingleNode(string.Format("/ListConfig/{0}[@type={1}]",tType.Name, Convert.ToInt32(type))).Attributes.GetNamedItem("attribute").Value);
for (int i = 0; i < list.Count; i++)
{
listBuilder.AppendFormat("<td {1}>{0}</td>", list.Item(i).InnerText, list.Item(i).Attributes.GetNamedItem("attribute").Value);
}
listBuilder.Append("</tr>");
PropertyInfo info;
//遍歷數據源,通過XML配置文件得到需要讀取的實體屬性,利用反射得到屬性值
foreach (T t in iqueryable)
{
listBuilder.Append("<tr>");
for (int i = 0; i < list.Count; i++)
{
info = tType.GetProperty(list.Item(i).Attributes.GetNamedItem("name").Value);
listBuilder.AppendFormat("<td>{0}</td>", info.GetValue(t, null));
}
listBuilder.Append("</tr>");
}
listBuilder.Append("</table>");
return listBuilder.ToString();
}
}
應用:
調用第一種XML配置
new ConstructEntityList<Project>().GetEntityListString((from s in patDataContext.Projects select s), ProjectList.Default);
結果:
查看原圖(大圖)
調用第二種XML配置
new ConstructEntityList<Project>().GetEntityListString((from s in patDataContext.Projects select s), ProjectList.More);
結果:
查看原圖(大圖)
好處:不需要修改源代碼,通過對XML配置文件的修改就可以實現table列表值的改變
場景:在項目管理系統中對於普通用戶只需要看到項目名稱,項目概述,負責人;對於管理者需要看到項目名稱,項目概述,負責人,項目進度,項目成果;哪麼我們只需要對不同情況定制一個xml塊,生成列表時只要指定實用那個XML塊哪麼顯示內容自動改變。