記錄下一些讀取XML的方法,以免到用的時候忘記了,還得花時間去找。
現在我有一個XML文件如下:
現在我要查找名字為"王五"的這個人的 Id 和sex(性別) 和age(年齡)
代碼:
static void Main(string[] args) { XDocument xdoc = XDocument.Load("4.xml"); //加載xml List<XElement> eles = new List<XElement>(); //用來獲取符合條件的節點集合 XElement ele = xdoc.Element("root"); //獲取根節點 string nameTxt = "王五"; //要查找的條件 TraditionalReadXML(ele,eles,nameTxt); //找到符合條件的數據添加到eles的集合裡 foreach (XElement item in eles) //遍歷查到的數據,輸出 { Console.WriteLine("Id:{0},name:{1},sex:{2},age:{3}", item.Attribute("id").Value,item.Element("name").Value,item.Element("sex").Value,item.Element("age").Value); } Console.ReadKey(); } /// <summary> /// 傳統讀取XML /// </summary> /// <param name="ele">查到哪個節點下的數據</param> /// <param name="eles">集合存放符合的數據</param> /// <param name="nameTxt">要查找的姓名</param> private static void TraditionalReadXML(XElement ele,List<XElement> eles,string nameTxt) { //首先遍歷ele下的所有子節點,注意是子節點,不能查到下下層的節點 foreach (XElement item in ele.Elements()) { //判斷這個元素的名字是不是name,如果是name,看內容是不是nameTxt if (item.Name.LocalName == "name") { if (item.Value == nameTxt) { //符合條件的節點,取其父級 eles.Add(item.Parent); } } //如果item裡面還有子節點就遞歸 TraditionalReadXML(item, eles, nameTxt); } }
執行代碼得到的結果為:
把上面的代碼改成:
static void Main(string[] args) { XDocument xdoc = XDocument.Load("4.xml"); //加載xml List<XElement> eles = new List<XElement>(); //獲取符合條件的節點集合 string nameTxt = "王五"; //要查找的條件 //獲得符合條件的節點 var query = from s in xdoc.Descendants() where s.Name.LocalName == "name" && s.Value ==nameTxt select s.Parent; foreach (XElement item in query) //把符合條件的節點添加到eles集合 { eles.Add(item); } foreach (XElement item in eles) //遍歷查到的數據,輸出 { Console.WriteLine("Id:{0},name:{1},sex:{2},age:{3}", item.Attribute("id").Value,item.Element("name").Value,item.Element("sex").Value,item.Element("age").Value); } Console.ReadKey();
}
加粗的地方為linq寫法,它們的實現是一樣的,這樣會比普通的寫法簡單許多。
把代碼改成:
static void Main(string[] args) { XDocument xdoc = XDocument.Load("4.xml"); //加載xml List<XElement> eles = new List<XElement>(); //獲取符合條件的節點集合 string nameTxt = "王五"; //要查找的條件 //遍歷節點,把符合條件的添加到 eles集合 foreach (XElement i in xdoc.Descendants().Where(e=>{ if(e.Name.LocalName=="name") { if(e.Value==nameTxt) { return true ; } } return false; })) { eles.Add(i.Parent); } foreach (XElement item in eles) //遍歷查到的數據,輸出 { Console.WriteLine("Id:{0},name:{1},sex:{2},age:{3}", item.Attribute("id").Value,item.Element("name").Value,item.Element("sex").Value,item.Element("age").Value); } Console.ReadKey(); }
以上是三種讀取XML的方法,可以根據自己喜歡的方法去用。