假設我們現在配置了一個這樣的XML文件,文件名為ReportConfig.xml

1 <?xml version="1.0" encoding="utf-8" ?> 2 <Reports> 3 <Report name="JZ_FSJZW" title="建設征地集鎮房屋附屬建築物調查表" rowPerPage="34"> 4 <Head> 5 <Field name="A1" warpText="調查表標題" valueIndex ="0"/> 6 <Field name="C2" warpText="設計階段" valueIndex ="1"/> 7 </Head> 8 <Data startWriteDataRowIndex="7"> 9 <Field name="A" colIndex="1" valueIndex="1" warpText="序號" /> 10 <Field name="B" colIndex="2" valueIndex="2" warpText="項目名稱" /> 11 </Data> 12 <Sign rowHeight="20" pzxzfl="NCFW_FSJZW_LXGM"> 13 <Field name="QSR" startColName="A" endColName="B" fontSize="9" align="right" rowIndex="1"/> 14 </Sign> 15 <Sql> 16 <![CDATA[select * from t_cj_hz_fsjzw where HZXX_ID='@HZXX_ID']]> 17 </Sql> 18 </Report> 19 </Reports>
那么我們如何實現根據Report結點里的name屬性值,得到相應的rowPerPage屬性值呢!下面給大家提供幾個方法:

1 /// <summary> 2 /// 根據Repotr結點的name屬性,獲得rowPerPage值 3 /// </summary> 4 /// <param name="reportName">屬性name值</param> 5 /// <returns>rowPerPage值</returns> 6 public static int GetRowPerPage(string reportName) 7 { 8 int rowPerPage = 0; 9 XmlNode node = GetReportNode(reportName); 10 if (isContainsAttribute(node, "rowPerPage")) 11 { 12 int.TryParse(node.Attributes["rowPerPage"].Value, out rowPerPage); 13 } 14 return rowPerPage; 15 } 16 17 /// <summary> 18 /// 獲取報表配置的相應XmlNode 19 /// </summary> 20 /// <param name="reportName">報表名</param> 21 /// <param name="nodeName">配置文件中的節點名,如需要獲取Report節點,則不需要傳入此參數</param> 22 /// <returns>返回報表配置的相應XmlNode</returns> 23 public static XmlNode GetReportNode(string reportName, string nodeName = "") 24 { 25 XmlDocument _objXmlDoc = new XmlDocument(); 26 //StartupPath應用程序的可執行程序路徑,也就是bin\Debug下,注意一定要將ReportConfig.xml文件復制到‘輸出目錄’屬性設置為‘始終復制’才能獲取到該文件 27 _objXmlDoc.Load(System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath, "ReportConfig.xml")); 28 string xpath = "Reports//Report[@name='" + reportName + "']"; 29 if (!string.IsNullOrEmpty(nodeName)) 30 { 31 xpath += "//" + nodeName; 32 } 33 return _objXmlDoc.SelectSingleNode(xpath); 34 } 35 36 /// <summary> 37 /// 判斷指定的xml節點中是否包含指定的屬性 38 /// </summary> 39 /// <param name="xmlnode">xml節點</param> 40 /// <param name="attributeName">屬性名</param> 41 /// <returns>判斷指定的xml節點中是否包含指定的屬性,如果包含則返回true,否則返回false</returns> 42 public static bool isContainsAttribute(System.Xml.XmlNode xmlnode, string attributeName) 43 { 44 bool flag = false; 45 for (int i = 0; i < xmlnode.Attributes.Count; i++) 46 { 47 if (xmlnode.Attributes[i].Name == attributeName) 48 { 49 flag = true; 50 break; 51 } 52 } 53 return flag; 54 }
下面我們就來實現一個簡單的功能吧!
要實現的功能是,當我們改變 ReportName時,要得到對應的rowPerPage值。(我們可以多配幾個Report結點來看效果)

1 private void Form1_Load(object sender, EventArgs e) 2 { 3 XmlDocument doc = new XmlDocument(); 4 doc.Load(System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath, "ReportConfig.xml")); 5 //獲取Reports下的所有Report結點 6 XmlNodeList nodes = doc.SelectNodes("Reports//Report"); 7 for (int i = 0; i < nodes.Count; i++) 8 { 9 for (int j = 0; j < nodes[i].Attributes.Count; j++) 10 { 11 if (nodes[i].Attributes[j].Name == "name") 12 { 13 cbx_ReportName.Items.Add(nodes[i].Attributes[j].Value); 14 } 15 } 16 } 17 18 //cbx_ReportName.SelectedValueChanged += (action, b) => 19 // { 20 // textBox1.Text = XMLFunction.GetRowPerPage(cbx_ReportName.SelectedItem.ToString()).ToString(); 21 // }; 22 23 //此行代碼+cbx_ReportName_SelectedValueChanged事件等於上面注釋的代碼 24 cbx_ReportName .SelectedValueChanged +=new EventHandler(cbx_ReportName_SelectedValueChanged); 25 } 26 27 private void cbx_ReportName_SelectedValueChanged(object sender, EventArgs e) 28 { 29 textBox1.Text = XMLFunction.GetRowPerPage(cbx_ReportName.SelectedItem.ToString()).ToString(); 30 }