溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何快速上手LINQ to XML

發(fā)布時(shí)間:2021-11-17 16:30:21 來(lái)源:億速云 閱讀:111 作者:柒染 欄目:web開(kāi)發(fā)

如何快速上手LINQ to XML,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

操作XML的技術(shù)有很多種:

1)DOM(Document Object Model,文檔對(duì)象模型),它為XML文檔提供了一個(gè)標(biāo)準(zhǔn)的解析。

2)XPath和XSLT,它們提供了查詢和格式化XML的功能。

3).NET框架中提供了一些對(duì)XML操作的類(lèi)(在System.XML命名空間下)。

4)LINQ to XML。

在我看來(lái)有了LINQ to XML技術(shù),.NET中其它操縱XML的技術(shù)都可以棄而不用了,因?yàn)長(zhǎng)INQ to XML操縱XML比其它技術(shù)都更簡(jiǎn)單更方便也更直觀。

LINQ to XML 是基于LINQ的,所以可以使用LINQ的所有功能,如標(biāo)準(zhǔn)查詢操作符(詳細(xì)可閱讀《LINQ標(biāo)準(zhǔn)查詢操作符詳解》)和LINQ的編程接口。使用LINQ to XML可以很方便地將XML文件加載到內(nèi)存中,對(duì)XML文檔中的節(jié)點(diǎn)進(jìn)行查詢修改刪除等各種操作,然后又可以很方便地將操作后的XML文檔保存回磁盤(pán)。

System.Xml.Linq的命名空間中包含了LINQ to XML處理XML用到的所有類(lèi),共有19個(gè)類(lèi),如下所示。

類(lèi)                                    說(shuō)明

如何快速上手LINQ to XML

Extensions                     包含 LINQ to XML 擴(kuò)展方法。

如何快速上手LINQ to XML

XAttribute                       表示一個(gè) XML 特性。

如何快速上手LINQ to XML

XCData                          表示一個(gè)包含 CDATA 的文本節(jié)點(diǎn)。

如何快速上手LINQ to XML

XComment                     表示一個(gè) XML 注釋。

如何快速上手LINQ to XML

XContainer                    表示可包含其他節(jié)點(diǎn)的節(jié)點(diǎn)。

如何快速上手LINQ to XML

XDeclaration                  表示一個(gè) XML 聲明。

如何快速上手LINQ to XML

XDocument                    表示 XML 文檔。

如何快速上手LINQ to XML

XDocument                    Type表示 XML 文檔類(lèi)型定義 (DTD)。

如何快速上手LINQ to XML

XElement                       表示一個(gè) XML 元素。

如何快速上手LINQ to XML

XName                            表示 XML 元素或特性的名稱。

如何快速上手LINQ to XML

XNamespace                   表示一個(gè) XML 命名空間。 此類(lèi)不能被繼承。

如何快速上手LINQ to XML

XNode                             表示 XML 樹(shù)中節(jié)點(diǎn)的抽象概念(元素、注釋、文檔類(lèi)型、處理指令或文本節(jié)點(diǎn))。

如何快速上手LINQ to XML

XNodeDocumentOrderComparer            包含用于比較節(jié)點(diǎn)的文檔順序的功能。 無(wú)法繼承此類(lèi)。

如何快速上手LINQ to XML

XNodeEqualityComparer                        比較節(jié)點(diǎn)以確定其是否相等。 無(wú)法繼承此類(lèi)。

如何快速上手LINQ to XML

XObject                                                  表示 XML 樹(shù)中的節(jié)點(diǎn)或特性。

如何快速上手LINQ to XML

XObjectChangeEventArgs                     提供有關(guān) Changing 和 Changed 事件的數(shù)據(jù)。

如何快速上手LINQ to XML

XProcessingInstruction                          表示 XML 處理指令。

如何快速上手LINQ to XML

XStreamingElement                               表示支持延遲流輸出的 XML 樹(shù)中的元素。

如何快速上手LINQ to XML

XText                                                     表示一個(gè)文本節(jié)點(diǎn)。

這19個(gè)類(lèi)提供了很多很多的方法,事實(shí)上很少人會(huì)在學(xué)習(xí)LINQ to XML的時(shí)候去學(xué)習(xí)每一種的方法的細(xì)節(jié),本文的目的是讓從來(lái)沒(méi)有使用過(guò)LINQ to XML的童鞋在需要使用LINQ to XML技術(shù)的時(shí)候快速上手,然后用之于自己的程序開(kāi)發(fā)中,所以本文只講LINQ to XML處理XML類(lèi)中最常用、用到最多的三個(gè)類(lèi),分別是XDocument、XElement和XAttribute。

XDocument類(lèi)派生于XContainer類(lèi),因此它可以有子節(jié)點(diǎn),但XML的標(biāo)準(zhǔn)限制了XDocument對(duì)象只包含單個(gè)XElement子節(jié)點(diǎn),因?yàn)閄ML文檔只允許有一個(gè)根節(jié)點(diǎn)。

XDocument提供了處理有效XML文檔,包括聲明、注釋和處理指令。

XDocument 可以包含以下元素:

1)一個(gè) XDeclaration 對(duì)象。 XDeclaration 使您能夠指定 XML 聲明的相關(guān)部分:XML 版本、文檔的編碼以及 XML 文檔是否是獨(dú)立的。

2)一個(gè) XElement 對(duì)象。 這是 XML 文檔的根節(jié)點(diǎn)。

3)任意數(shù)目的 XProcessingInstruction 對(duì)象。 處理指令將信息傳遞給處理 XML 的應(yīng)用程序。

4)任意數(shù)目的 XComment 對(duì)象。 注釋將與根元素同級(jí)。 XComment 對(duì)象不能是列表中的***個(gè)參數(shù),因?yàn)?XML 文檔以注釋開(kāi)頭無(wú)效。

5)一個(gè)用于 DTD 的 XDocumentType。

XDocument類(lèi)提供的方法可參考MSDN文檔。

XElement派生自XContainer,而XContainer又派生于XNode類(lèi),所以一個(gè)元素也是一個(gè)節(jié)點(diǎn)。通過(guò)XElement可以創(chuàng)建XML的元素,添加和修改,移除元素以及子元素。

XElement類(lèi)提供了很多方法,因?yàn)橐粋€(gè)XML文檔中最為核心的東西就是XElement,這些方法使得我們處理XML提供如囊中取物般簡(jiǎn)單。

XElement類(lèi)提供的方法可以參考MSDN文檔。

XAttribute派生于XObject類(lèi),不是派生于XNode類(lèi),所以XAttribute不能作為XML樹(shù)中的節(jié)點(diǎn),它是與XElement相關(guān)聯(lián)的名稱/值對(duì),也就是XAttibute不能獨(dú)立于元素而存在。

XAttribute類(lèi)提供的方法可參考MSDN文檔。

本文的重點(diǎn)是講述如何用LINQ to XML技術(shù)操縱XML文檔,包含如何創(chuàng)建一個(gè)XML文檔,如何保存XML文檔,如何遍歷XML文檔元素,如何查找XML文檔元素,如何更新XML文檔的元素,如何刪除XML文檔元素等,下面我們假設(shè)一個(gè)應(yīng)用場(chǎng)景來(lái)使用LINQ to XML技術(shù)來(lái)實(shí)現(xiàn)剛才所說(shuō)的種種操作。

場(chǎng)景:將中國(guó)的省市區(qū)信息保存在一個(gè)XML文檔中,可以方便地對(duì)該文檔進(jìn)行各種操作,如查詢,更新,刪除元素等。

下面我們先創(chuàng)建省市區(qū)的相關(guān)類(lèi),如下:

public class Province      {         /// <summary>        /// 省份名稱         /// </summary>        public string Name { get; set; }         /// <summary>        /// 省會(huì)         /// </summary>        public string Capital { get; set; }       }       public class City      {          /// <summary>         /// 城市名稱          /// </summary>         public string Name { get; set; }          /// <summary>         /// 城市編號(hào)          /// </summary>         public string Code { get; set; }           public Province Province { get; set; }      }       public class District      {          /// <summary>         /// 區(qū)名          /// </summary>         public string Name { get; set; }           /// <summary>         /// 描述          /// </summary>         public string Description { get; set; }           public City City { get; set; }      }

1)如何創(chuàng)建一個(gè)保存中國(guó)省市區(qū)信息的XML文檔。

使用LINQ to XML 創(chuàng)建一個(gè)XML文檔非常簡(jiǎn)單,代碼如下:

static void Main(string[] args)          {              //獲取當(dāng)前應(yīng)用程序目錄下Area.xml文件的路徑              string _filePath = Path.Combine(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "Area.xml");              FileInfo fiXML = new FileInfo(_filePath);              //如果文件不存在              if (!(fiXML.Exists))              {                  XDocument xelLog = new XDocument(                      new XDeclaration("1.0", "utf-8", "yes"),                      new XComment("XML File For AREA"),                      new XElement("Provinces",                                   new XElement("Province", new XAttribute("Name", "省份"),                                                new XElement("City", new XAttribute("Name", "城市"),                                                             new XElement("District", new XAttribute("Name", "行政區(qū)")))                                        )                          )                      );                  xelLog.Save(_filePath);              }          }

這段代碼使用指定的內(nèi)容初始化 XDocument 類(lèi)的新實(shí)例,然后調(diào)用XDocument的Save方法來(lái)生成一個(gè)XML文檔。很少使用XDocument來(lái)創(chuàng)建XML樹(shù),通常是使用 XElement 根節(jié)點(diǎn)創(chuàng)建 XML 樹(shù)。除非具有創(chuàng)建文檔的具體要求(例如,必須在***創(chuàng)建處理指令和注釋,或者必須支持文檔類(lèi)型),否則使用 XElement 作為根節(jié)點(diǎn)通常會(huì)更方便。運(yùn)行這段代碼,就會(huì)在生成的應(yīng)用程序根目錄下創(chuàng)建一個(gè)名為Area.xml的文檔,文檔內(nèi)容如下:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> <!--XML File For AREA--> <Provinces>   <Province Name="省份">     <City Name="城市">       <District Name="行政區(qū)" />     </City>   </Province> </Provinces>

2)如何將一個(gè)XML樹(shù)加載到程序內(nèi)存。

我們操作一個(gè)XML文檔首先是需要將該文檔加載到程序的內(nèi)存中,在LINQ to XML中,通常是使用XElement類(lèi)型的Load方法將XML文檔自根節(jié)點(diǎn)開(kāi)始的XML樹(shù)加載到一個(gè)XElement類(lèi)型的對(duì)象中,然后我們就可以采用XElement提供的各種方法對(duì)這個(gè)內(nèi)存中XML文檔進(jìn)行各種操作。

我們創(chuàng)建一個(gè)LINQtoXML的幫助類(lèi)LinqToXmlHelper.cs,將對(duì)XML操作的相關(guān)方法都寫(xiě)在這個(gè)類(lèi)里面,下面是一個(gè)加載XML文檔到XElement對(duì)象的方法。

/// <summary>         /// 將Area.xml文檔加載到內(nèi)存中的XElement類(lèi)型的對(duì)象xElement,成功調(diào)用 XElement.Load方法后會(huì)在xElement保存整棵XML樹(shù)          /// </summary>         /// <returns></returns>         public XElement Load()          {              XElement xElement = XElement.Load(_filePath);              return xElement;          }

我們剛才已經(jīng)創(chuàng)建了一個(gè)XML文檔,現(xiàn)在我們將這個(gè)文檔加載到內(nèi)存中,然后打印這個(gè)XElement對(duì)象。

static void Main(string[] args)          {              LinqToXmlHelper linqToXmlHelper = new LinqToXmlHelper();              var elements = linqToXmlHelper.Load();              string str = elements.ToString();               Console.WriteLine(str);              Console.ReadKey();  }

輸出結(jié)果如下:

如何快速上手LINQ to XML

3)如何向現(xiàn)有的XML文檔插入新的元素

到現(xiàn)在,我們已經(jīng)了解了LINQ to XML中創(chuàng)建和加載XML文檔的方式,接下來(lái)的問(wèn)題就是如何向一個(gè)已經(jīng)存在的XML文檔添加新的節(jié)點(diǎn)。下面是增加新元素的方法,我們可以向Area.xml文檔中添加新是省份城市和區(qū)域信息,如果已經(jīng)存在的區(qū)域則進(jìn)行更新,這里用XElement的Save對(duì)更改后的XML文檔進(jìn)行保存。

/// <summary>        /// 增加新元素,如果要增加的區(qū)已經(jīng)存在,則對(duì)區(qū)的Description進(jìn)行更新         /// </summary>        /// <param name="districts"></param>        public void AddElement(IList<District> districts)         {             if(districts==null||districts.Count==0) return;              XElement xElement = Load();             foreach (District district in districts)             {                 if (district.City == null || district.City.Province == null)                 {                     continue;                 }                 XElement provinceElement = xElement.Elements("Province").Where(e => ((string)e.Attribute("Name")).Equals(district.City.Province.Name)).FirstOrDefault();                //判斷該省份是否存在,不存在曾增加該省份的節(jié)點(diǎn)                 if(provinceElement==null)                 {                      provinceElement = new XElement("Province", new XAttribute("Name", district.City.Province.Name), new XAttribute("Capital", district.City.Province.Capital));                     xElement.Add(provinceElement);                 }                  XElement cityElement = provinceElement.Elements("City").Where(e => ((string)e.Attribute("Name")).Equals(district.City.Name)).FirstOrDefault();                 //判斷該城市是否存在,不存在則在對(duì)應(yīng)省份下增加該城市的節(jié)點(diǎn)                 if(cityElement==null)                 {                     cityElement = new XElement("City", new XAttribute("Name", district.City.Name), new XAttribute("Code", district.City.Code));                     provinceElement.Add(cityElement);                 }                  XElement districtElement = xElement.Elements("District").Where(e => ((string)e.Attribute("Name")).Equals(district.Name)).FirstOrDefault();                 //如果存在該區(qū)域的節(jié)點(diǎn)則先刪除在添加,以這種方式更新節(jié)點(diǎn)                 if(districtElement!=null)                 {                     districtElement.Remove();                 }                 districtElement = new XElement("District", new XAttribute("Name", district.Name), new XAttribute("Description", district.Description));                 cityElement.Add(districtElement);              }            //操作完畢,將內(nèi)存中的XML樹(shù)保存回硬盤(pán)的XML文檔中。           xElement.Save(_filePath);         }

上面的AddElement方法中,調(diào)用XElement對(duì)象的傳一個(gè)XElement對(duì)象的Add方法, 可以將一個(gè)XElement對(duì)象(節(jié)點(diǎn))添加為一個(gè)已有節(jié)點(diǎn)的最后子節(jié)點(diǎn)。這樣我們通過(guò)Add的方式就可以輕易擴(kuò)展一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)。

下面調(diào)用增加新元素AddElement方法,將一個(gè)區(qū)的集合信息保存到Area.xml文檔中,然后打印XML樹(shù)。代碼如下:

static void Main(string[] args)          {                            LinqToXmlHelper linqToXmlHelper = new LinqToXmlHelper();              Province province = new Province() { Name = "廣東省", Capital = "廣州市" };              City city = new City() { Name = "廣州市", Code = "020", Province = province };              IList<District> districts = new List<District>()                                              { new District() {City = city, Name = "天河區(qū)", Description = "天河區(qū)的描述"}, new District() {City = city, Name = "越秀區(qū)", Description = "越秀區(qū)的描述"}                                                                                                };              linqToXmlHelper.AddElement(districts);              XElement xElement = linqToXmlHelper.Load();              Console.WriteLine(xElement.ToString());  }

輸出結(jié)果如圖:

如何快速上手LINQ to XML

4)如何查詢和遍歷XML文檔的元素

根據(jù)XElement類(lèi)型提供的Elements方法,我們可以獲取某個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn)元素,也可以通過(guò)傳入節(jié)點(diǎn)名稱為參數(shù),獲取某個(gè)節(jié)點(diǎn)下所有和參數(shù)節(jié)點(diǎn)名稱相匹配的節(jié)點(diǎn)集合,可以根據(jù)XElement類(lèi)型提供的Attibute方法獲取某節(jié)點(diǎn)的屬性信息,下面代碼示例根據(jù)城市名查詢?cè)摮鞘邢滤械膮^(qū)的信息:

/// <summary>         /// 根據(jù)城市名查詢?cè)摮鞘邢滤械膮^(qū)的信息          /// </summary>         /// <param name="cityName"></param>         /// <returns></returns>         public IList<District> GetDistricts(string cityName)          {              IList<District> districts = new List<District>();              XElement xElement = Load();              //獲取城市名為變量cityName的節(jié)點(diǎn)的所有子節(jié)點(diǎn)              IEnumerable<XElement> xElementxElements =                  xElement.Elements("Province").Elements().Where(e => ((string) e.Attribute("Name")).Equals(cityName)).Elements();              foreach (XElement element in xElements)              {                  District district = new District();                  district.Name = (string) element.Attribute("Name");                  district.Description = (string) element.Attribute("Description");                  districts.Add(district);               }              return districts;          }

調(diào)用GetDistricts方法

static void Main(string[] args)          {                            LinqToXmlHelper linqToXmlHelper = new LinqToXmlHelper();              IList<District> districts = linqToXmlHelper.GetDistricts("廣州市");              foreach (var district in districts)              {                  Console.WriteLine(district.Name);              }            }

輸出結(jié)果為:

天河區(qū)

越秀區(qū)

5)如何刪除XML文檔中的節(jié)點(diǎn)元素

刪除區(qū)的節(jié)點(diǎn)元素的方法,這里假定區(qū)的名稱是唯一的

/// <summary>         /// 刪除區(qū)的節(jié)點(diǎn)元素,這里假定區(qū)的名稱是唯一的          /// </summary>         /// <param name="districts"></param>         public void DeleteElement(IList<District> districts)          {              XElement xElement = Load();              foreach (District district in districts)              {                                   XElement districtElement = xElement.Elements("Province").Elements("City").Elements("District").Where(e => ((string)e.Attribute("Name")).Equals(district.Name)).FirstOrDefault();                  if(districtElement!=null)                  {                      districtElement.Remove();                  }              }              xElement.Save(_filePath);           }

調(diào)用XElement.Remove方法可以在當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)上刪除當(dāng)前節(jié)點(diǎn)。下面代碼刪除區(qū)節(jié)點(diǎn)中名稱為“越秀區(qū)”的節(jié)點(diǎn)。

static void Main(string[] args)          {                            LinqToXmlHelper linqToXmlHelper = new LinqToXmlHelper();              IList<District> districts = new List<District>(){new District(){Name = "越秀區(qū)"} };              linqToXmlHelper.DeleteElement(districts);              XElement xElement = linqToXmlHelper.Load();              Console.WriteLine(xElement.ToString());              Console.ReadKey();           }

輸出結(jié)果為:

如何快速上手LINQ to XML

到這里,你已經(jīng)看到了LINQ to XML技術(shù)操作XML最為常用一些功能,包括創(chuàng)建和加載XML文檔,新增刪除更新XML節(jié)點(diǎn)等。

關(guān)于如何快速上手LINQ to XML問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI