C#中讀取xml文件指定節點


目錄(?)[-]

  1. XmlDocumentSelectSingleNode方法的使用
  2. XmlDocumentSelectNodes方法的使用
  3. 通過節點屬性查找指定節點
 

參考:Select XML Nodes by Name

假設xml文件內容是

[c-sharp] view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <Workflow>  
  3.   <Activity>  
  4.     <ActivityId>1</ActivityId>  
  5.     <ActivityName>start</ActivityName>  
  6.     <BindingPageId>1</BindingPageId>  
  7.     <BindingRoleId>1</BindingRoleId>  
  8.     <ActivityLevel>1</ActivityLevel>  
  9.   </Activity>  
  10.   <Activity>  
  11.     <ActivityId>2</ActivityId>  
  12.     <ActivityName>pass</ActivityName>  
  13.     <BindingPageId>2</BindingPageId>  
  14.     <BindingRoleId>2</BindingRoleId>  
  15.     <ActivityLevel>2</ActivityLevel>  
  16.   </Activity>  
  17. </Workflow>  

 

我們需要讀取Activity節點下的內容,因為存在多個Activity,所以需要讀取多個節點。可以使用 XmlDocument.SelectSingleNode和XmlDocument.SelectNodes方法查找節點。前一個是查找匹配的第一個節點,而后一個則會返回一個節點列表。

1.XmlDocument.SelectSingleNode方法的使用

首先創建一個讀取xml文件的方法ReadXmlNode

[c-sharp] view plain copy print ?
  1. /// <summary>    
  2.       /// 讀取xml中的指定節點的值  
  3.       /// </summary>    
  4.       public void ReadXmlNode(string filename)  
  5.       {  
  6.           XmlDocument xmlDoc = new XmlDocument();  
  7.           try  
  8.           {  
  9.               xmlDoc.Load(filename);  
  10.               //讀取Activity節點下的數據。SelectSingleNode匹配第一個Activity節點  
  11.               XmlNode root = xmlDoc.SelectSingleNode("//Activity");//當節點Workflow帶有屬性是,使用SelectSingleNode無法讀取          
  12.               if (root != null)  
  13.               {  
  14.                   string ActivityId = (root.SelectSingleNode("ActivityId")).InnerText;  
  15.                   string ActivityName = (root.SelectSingleNode("ActivityName ")).InnerText;  
  16.                   string ActivityLevel = root.SelectSingleNode("ActivityLevel").InnerText;  
  17.                   Console.WriteLine("ActivityId:" + ActivityId + "/nActivityName:" + ActivityName + "/nActivityLevel:" + ActivityLevel);  
  18.               }  
  19.               else  
  20.               {  
  21.                   Console.WriteLine("the node  is not existed");  
  22.                   //Console.Read();  
  23.               }  
  24.           }  
  25.           catch (Exception e)  
  26.           {  
  27.               //顯示錯誤信息  
  28.               Console.WriteLine(e.Message);  
  29.           }  
  30.       }  

 

然后在主函數中調用該方法

[c-sharp] view plain copy print ?
  1. class Program  
  2.     {  
  3.         static void Main(string[] args)  
  4.         {  
  5.             XMLOperation xmlOpr = new XMLOperation();  
  6.             xmlOpr.ReadXmlNode("activity.xml");  
  7.             Console.Read();  
  8.         }  
  9.     }  

 

輸出結果為:

ActivityId:1 ActivityName:start ActivityLevel:1

 

2.XmlDocument.SelectNodes方法的使用

[c-sharp] view plain copy print ?
  1. /// <summary>    
  2.      /// 讀取xml中的指定節點的值,如果有多個同名節點,則全部讀取  
  3.      /// </summary>    
  4.      public void ReadXmlNodes(string filename)  
  5.      {  
  6.          XmlDocument xmlDoc = new XmlDocument();  
  7.          try  
  8.          {  
  9.              xmlDoc.Load(filename);  
  10.              XmlNodeList xnList = xmlDoc.SelectNodes("//Activity");  
  11.              Console.WriteLine("共有{0}個節點", xnList.Count);//輸出xnList中節點個數。  
  12.              foreach (XmlNode xn in xnList)  
  13.              {  
  14.                  //無法使用xn["ActivityId"].InnerText  
  15.                  string ActivityId = (xn.SelectSingleNode("ActivityId")).InnerText;  
  16.                  string ActivityName = xn.SelectSingleNode("ActivityName").InnerText;  
  17.                  string ActivityLevel = xn.SelectSingleNode("ActivityLevel").InnerText;  
  18.                  //  Console.WriteLine("ActivityId:" + ActivityId + "/nActivityName:" + ActivityName + "/nActivityLevel:" + ActivityLevel);  
  19.                  Console.WriteLine("ActivityId:  {0}/nActivityName:  {1}/nActivityLevel:  {2}", ActivityId, ActivityName, ActivityLevel);  
  20.              }  
  21.          }  
  22.          catch (Exception e)  
  23.          {  
  24.              //顯示錯誤信息  
  25.              Console.WriteLine(e.Message);  
  26.          }  
  27.      }  

 

然后在主函數中調用該方法

[c-sharp] view plain copy print ?
  1. class Program  
  2.    {  
  3.        static void Main(string[] args)  
  4.        {  
  5.            XMLOperation xmlOpr = new XMLOperation();  
  6.            xmlOpr.ReadXmlNodes("activity.xml");  
  7.            Console.Read();  
  8.        }  
  9.    }  

 

 輸出結果為:

共有2個節點 ActivityId:  1 ActivityName:  start ActivityLevel:  1 ActivityId:  2 ActivityName:  pass ActivityLevel:  2

3.通過節點屬性查找指定節點

參考http://www.csharp-examples.net/xml-nodes-by-attribute-value/,雖然沒有用到參考文章中的方法,不過總覺得以后會用到的。

[c-sharp] view plain copy print ?
  1. /// <summary>    
  2.      ///通過ActivityLevel獲取xmlnode,需要保證ActivityLevel在一個xml文檔中是唯一的。  
  3.      /// </summary>    
  4.      public XmlNode getXmlNode(string filename, string activitylevel)  
  5.      {  
  6.          XmlDocument xmlDoc = new XmlDocument();  
  7.          try  
  8.          {  
  9.              xmlDoc.Load(filename);  
  10.              XmlNodeList xnList = xmlDoc.SelectNodes("//Activity");//當節點Workflow帶有屬性是,使用SelectSingleNode無法讀取          
  11.              foreach (XmlNode xn in xnList)  
  12.              {  
  13.                  string ActivityLevel = xn.SelectSingleNode("ActivityLevel").InnerText;  
  14.                  if(activitylevel==ActivityLevel)  
  15.                  {  
  16.                      return xn;  
  17.                  }  
  18.              }  
  19.          }  
  20.          catch (Exception e)  
  21.          {  
  22.              //顯示錯誤信息  
  23.              Console.WriteLine(e.Message);  
  24.          }  
  25.          return null;  
  26.      }  

 

然后在主函數中調用該方法

[c-sharp] view plain copy print ?
  1. class Program  
  2.    {  
  3.        static void Main(string[] args)  
  4.        {  
  5.            XMLOperation xmlOpr = new XMLOperation();  
  6.            XmlNode xn=xmlOpr.getXmlNode("activity.xml", "2");  
  7.            string ActivityId = (xn.SelectSingleNode("ActivityId")).InnerText;  
  8.            string ActivityName = (xn.SelectSingleNode("ActivityName ")).InnerText;  
  9.            string ActivityLevel = xn.SelectSingleNode("ActivityLevel").InnerText;  
  10.            Console.WriteLine("ActivityId:" + ActivityId + "/nActivityName:" + ActivityName + "/nActivityLevel:" + ActivityLevel);  
  11.            Console.Read();  
  12.        }  
  13.    }  

 

輸出結果為:

ActivityId:2 ActivityName:pass ActivityLevel:2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM