C#基礎鞏固(3)-Linq To XML 讀取XML

記錄下一些讀取XML的方法,以避免到用的時候忘記了,還得花時間去找。spa

1、傳統寫法讀取XML

      如今我有一個XML文件以下:code

 

如今我要查找名字爲"王五"的這我的的 Id 和sex(性別) 和age(年齡)xml

代碼:blog

 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);
            }
        }

執行代碼獲得的結果爲:遞歸

2、Linq寫法讀取XML

          把上面的代碼改爲:string

 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寫法,它們的實現是同樣的,這樣會比普通的寫法簡單許多。it

3、Linq查詢lambda寫法

把代碼改爲:io

 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的方法,能夠根據本身喜歡的方法去用。class

相關文章
相關標籤/搜索