參考:Select XML Nodes by Name
假設xml檔案內容是
<?xml version="1.0" encoding="utf-8"?><br /><Workflow><br /> <Activity><br /> <ActivityId>1</ActivityId><br /> <ActivityName>start</ActivityName><br /> <BindingPageId>1</BindingPageId><br /> <BindingRoleId>1</BindingRoleId><br /> <ActivityLevel>1</ActivityLevel><br /> </Activity><br /> <Activity><br /> <ActivityId>2</ActivityId><br /> <ActivityName>pass</ActivityName><br /> <BindingPageId>2</BindingPageId><br /> <BindingRoleId>2</BindingRoleId><br /> <ActivityLevel>2</ActivityLevel><br /> </Activity><br /></Workflow>
我們需要讀取Activity節點下的內容,因為存在多個Activity,所以需要讀取多個節點。可以使用 XmlDocument.SelectSingleNode和XmlDocument.SelectNodes方法尋找節點。前一個是尋找匹配的第一個節點,而後一個則會返回一個節點列表。
1.XmlDocument.SelectSingleNode方法的使用
首先建立一個讀取xml檔案的方法ReadXmlNode
/// <summary><br /> /// 讀取xml中的指定節點的值<br /> /// </summary><br /> public void ReadXmlNode(string filename)<br /> {<br /> XmlDocument xmlDoc = new XmlDocument();<br /> try<br /> {<br /> xmlDoc.Load(filename);<br /> //讀取Activity節點下的資料。SelectSingleNode匹配第一個Activity節點<br /> XmlNode root = xmlDoc.SelectSingleNode("//Activity");//當節點Workflow帶有屬性是,使用SelectSingleNode無法讀取<br /> if (root != null)<br /> {<br /> string ActivityId = (root.SelectSingleNode("ActivityId")).InnerText;<br /> string ActivityName = (root.SelectSingleNode("ActivityName ")).InnerText;<br /> string ActivityLevel = root.SelectSingleNode("ActivityLevel").InnerText;<br /> Console.WriteLine("ActivityId:" + ActivityId + "/nActivityName:" + ActivityName + "/nActivityLevel:" + ActivityLevel);<br /> }<br /> else<br /> {<br /> Console.WriteLine("the node is not existed");<br /> //Console.Read();<br /> }<br /> }<br /> catch (Exception e)<br /> {<br /> //顯示錯誤資訊<br /> Console.WriteLine(e.Message);<br /> }<br /> }
然後在主函數中調用該方法
class Program<br /> {<br /> static void Main(string[] args)<br /> {<br /> XMLOperation xmlOpr = new XMLOperation();<br /> xmlOpr.ReadXmlNode("activity.xml");<br /> Console.Read();<br /> }<br /> }
輸出結果為:
ActivityId:1
ActivityName:start
ActivityLevel:1
2.XmlDocument.SelectNodes方法的使用
/// <summary><br /> /// 讀取xml中的指定節點的值,如果有多個同名節點,則全部讀取<br /> /// </summary><br /> public void ReadXmlNodes(string filename)<br /> {<br /> XmlDocument xmlDoc = new XmlDocument();<br /> try<br /> {<br /> xmlDoc.Load(filename);<br /> XmlNodeList xnList = xmlDoc.SelectNodes("//Activity");<br /> Console.WriteLine("共有{0}個節點", xnList.Count);//輸出xnList中節點個數。<br /> foreach (XmlNode xn in xnList)<br /> {<br /> //無法使用xn["ActivityId"].InnerText<br /> string ActivityId = (xn.SelectSingleNode("ActivityId")).InnerText;<br /> string ActivityName = xn.SelectSingleNode("ActivityName").InnerText;<br /> string ActivityLevel = xn.SelectSingleNode("ActivityLevel").InnerText;<br /> // Console.WriteLine("ActivityId:" + ActivityId + "/nActivityName:" + ActivityName + "/nActivityLevel:" + ActivityLevel);<br /> Console.WriteLine("ActivityId: {0}/nActivityName: {1}/nActivityLevel: {2}", ActivityId, ActivityName, ActivityLevel);<br /> }<br /> }<br /> catch (Exception e)<br /> {<br /> //顯示錯誤資訊<br /> Console.WriteLine(e.Message);<br /> }<br /> }
然後在主函數中調用該方法
class Program<br /> {<br /> static void Main(string[] args)<br /> {<br /> XMLOperation xmlOpr = new XMLOperation();<br /> xmlOpr.ReadXmlNodes("activity.xml");<br /> Console.Read();<br /> }<br /> }
輸出結果為:
共有2個節點
ActivityId: 1
ActivityName: start
ActivityLevel: 1
ActivityId: 2
ActivityName: pass
ActivityLevel: 2
3.通過節點屬性尋找指定節點
參考http://www.csharp-examples.net/xml-nodes-by-attribute-value/,雖然沒有用到參考文章中的方法,不過總覺得以後會用到的。
/// <summary><br /> ///通過ActivityLevel擷取xmlnode,需要保證ActivityLevel在一個xml文檔中是唯一的。<br /> /// </summary><br /> public XmlNode getXmlNode(string filename, string activitylevel)<br /> {<br /> XmlDocument xmlDoc = new XmlDocument();<br /> try<br /> {<br /> xmlDoc.Load(filename);<br /> XmlNodeList xnList = xmlDoc.SelectNodes("//Activity");//當節點Workflow帶有屬性是,使用SelectSingleNode無法讀取<br /> foreach (XmlNode xn in xnList)<br /> {<br /> string ActivityLevel = xn.SelectSingleNode("ActivityLevel").InnerText;<br /> if(activitylevel==ActivityLevel)<br /> {<br /> return xn;<br /> }<br /> }<br /> }<br /> catch (Exception e)<br /> {<br /> //顯示錯誤資訊<br /> Console.WriteLine(e.Message);<br /> }<br /> return null;<br /> }
然後在主函數中調用該方法
class Program<br /> {<br /> static void Main(string[] args)<br /> {<br /> XMLOperation xmlOpr = new XMLOperation();<br /> XmlNode xn=xmlOpr.getXmlNode("activity.xml", "2");<br /> string ActivityId = (xn.SelectSingleNode("ActivityId")).InnerText;<br /> string ActivityName = (xn.SelectSingleNode("ActivityName ")).InnerText;<br /> string ActivityLevel = xn.SelectSingleNode("ActivityLevel").InnerText;<br /> Console.WriteLine("ActivityId:" + ActivityId + "/nActivityName:" + ActivityName + "/nActivityLevel:" + ActivityLevel);<br /> Console.Read();<br /> }<br /> }
輸出結果為:
ActivityId:2
ActivityName:pass
ActivityLevel:2