中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何快速上手LINQ to XML

發布時間:2021-11-17 16:30:21 來源:億速云 閱讀:120 作者:柒染 欄目:web開發

如何快速上手LINQ to XML,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

操作XML的技術有很多種:

1)DOM(Document Object Model,文檔對象模型),它為XML文檔提供了一個標準的解析。

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

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

4)LINQ to XML。

在我看來有了LINQ to XML技術,.NET中其它操縱XML的技術都可以棄而不用了,因為LINQ to XML操縱XML比其它技術都更簡單更方便也更直觀。

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

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

類                                    說明

如何快速上手LINQ to XML

Extensions                     包含 LINQ to XML 擴展方法。

如何快速上手LINQ to XML

XAttribute                       表示一個 XML 特性。

如何快速上手LINQ to XML

XCData                          表示一個包含 CDATA 的文本節點。

如何快速上手LINQ to XML

XComment                     表示一個 XML 注釋。

如何快速上手LINQ to XML

XContainer                    表示可包含其他節點的節點。

如何快速上手LINQ to XML

XDeclaration                  表示一個 XML 聲明。

如何快速上手LINQ to XML

XDocument                    表示 XML 文檔。

如何快速上手LINQ to XML

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

如何快速上手LINQ to XML

XElement                       表示一個 XML 元素。

如何快速上手LINQ to XML

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

如何快速上手LINQ to XML

XNamespace                   表示一個 XML 命名空間。 此類不能被繼承。

如何快速上手LINQ to XML

XNode                             表示 XML 樹中節點的抽象概念(元素、注釋、文檔類型、處理指令或文本節點)。

如何快速上手LINQ to XML

XNodeDocumentOrderComparer            包含用于比較節點的文檔順序的功能。 無法繼承此類。

如何快速上手LINQ to XML

XNodeEqualityComparer                        比較節點以確定其是否相等。 無法繼承此類。

如何快速上手LINQ to XML

XObject                                                  表示 XML 樹中的節點或特性。

如何快速上手LINQ to XML

XObjectChangeEventArgs                     提供有關 Changing 和 Changed 事件的數據。

如何快速上手LINQ to XML

XProcessingInstruction                          表示 XML 處理指令。

如何快速上手LINQ to XML

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

如何快速上手LINQ to XML

XText                                                     表示一個文本節點。

這19個類提供了很多很多的方法,事實上很少人會在學習LINQ to XML的時候去學習每一種的方法的細節,本文的目的是讓從來沒有使用過LINQ to XML的童鞋在需要使用LINQ to XML技術的時候快速上手然后用之于自己的程序開發中,所以本文只講LINQ to XML處理XML類中最常用、用到最多的三個類,分別是XDocument、XElement和XAttribute。

XDocument類派生于XContainer類,因此它可以有子節點,但XML的標準限制了XDocument對象只包含單個XElement子節點,因為XML文檔只允許有一個根節點。

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

XDocument 可以包含以下元素:

1)一個 XDeclaration 對象。 XDeclaration 使您能夠指定 XML 聲明的相關部分:XML 版本、文檔的編碼以及 XML 文檔是否是獨立的。

2)一個 XElement 對象。 這是 XML 文檔的根節點。

3)任意數目的 XProcessingInstruction 對象。 處理指令將信息傳遞給處理 XML 的應用程序。

4)任意數目的 XComment 對象。 注釋將與根元素同級。 XComment 對象不能是列表中的***個參數,因為 XML 文檔以注釋開頭無效。

5)一個用于 DTD 的 XDocumentType。

XDocument類提供的方法可參考MSDN文檔。

XElement派生自XContainer,而XContainer又派生于XNode類,所以一個元素也是一個節點。通過XElement可以創建XML的元素,添加和修改,移除元素以及子元素。

XElement類提供了很多方法,因為一個XML文檔中最為核心的東西就是XElement,這些方法使得我們處理XML提供如囊中取物般簡單。

XElement類提供的方法可以參考MSDN文檔。

XAttribute派生于XObject類,不是派生于XNode類,所以XAttribute不能作為XML樹中的節點,它是與XElement相關聯的名稱/值對,也就是XAttibute不能獨立于元素而存在。

XAttribute類提供的方法可參考MSDN文檔。

本文的重點是講述如何用LINQ to XML技術操縱XML文檔,包含如何創建一個XML文檔,如何保存XML文檔,如何遍歷XML文檔元素,如何查找XML文檔元素,如何更新XML文檔的元素,如何刪除XML文檔元素等,下面我們假設一個應用場景來使用LINQ to XML技術來實現剛才所說的種種操作。

場景:將中國的省市區信息保存在一個XML文檔中,可以方便地對該文檔進行各種操作,如查詢,更新,刪除元素等。

下面我們先創建省市區的相關類,如下:

public class Province      {         /// <summary>        /// 省份名稱         /// </summary>        public string Name { get; set; }         /// <summary>        /// 省會         /// </summary>        public string Capital { get; set; }       }       public class City      {          /// <summary>         /// 城市名稱          /// </summary>         public string Name { get; set; }          /// <summary>         /// 城市編號          /// </summary>         public string Code { get; set; }           public Province Province { get; set; }      }       public class District      {          /// <summary>         /// 區名          /// </summary>         public string Name { get; set; }           /// <summary>         /// 描述          /// </summary>         public string Description { get; set; }           public City City { get; set; }      }

1)如何創建一個保存中國省市區信息的XML文檔。

使用LINQ to XML 創建一個XML文檔非常簡單,代碼如下:

static void Main(string[] args)          {              //獲取當前應用程序目錄下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", "行政區")))                                        )                          )                      );                  xelLog.Save(_filePath);              }          }

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

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

2)如何將一個XML樹加載到程序內存。

我們操作一個XML文檔首先是需要將該文檔加載到程序的內存中,在LINQ to XML中,通常是使用XElement類型的Load方法將XML文檔自根節點開始的XML樹加載到一個XElement類型的對象中,然后我們就可以采用XElement提供的各種方法對這個內存中XML文檔進行各種操作。

我們創建一個LINQtoXML的幫助類LinqToXmlHelper.cs,將對XML操作的相關方法都寫在這個類里面,下面是一個加載XML文檔到XElement對象的方法。

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

我們剛才已經創建了一個XML文檔,現在我們將這個文檔加載到內存中,然后打印這個XElement對象。

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

輸出結果如下:

如何快速上手LINQ to XML

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

到現在,我們已經了解了LINQ to XML中創建和加載XML文檔的方式,接下來的問題就是如何向一個已經存在的XML文檔添加新的節點。下面是增加新元素的方法,我們可以向Area.xml文檔中添加新是省份城市和區域信息,如果已經存在的區域則進行更新,這里用XElement的Save對更改后的XML文檔進行保存。

/// <summary>        /// 增加新元素,如果要增加的區已經存在,則對區的Description進行更新         /// </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();                //判斷該省份是否存在,不存在曾增加該省份的節點                 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();                 //判斷該城市是否存在,不存在則在對應省份下增加該城市的節點                 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();                 //如果存在該區域的節點則先刪除在添加,以這種方式更新節點                 if(districtElement!=null)                 {                     districtElement.Remove();                 }                 districtElement = new XElement("District", new XAttribute("Name", district.Name), new XAttribute("Description", district.Description));                 cityElement.Add(districtElement);              }            //操作完畢,將內存中的XML樹保存回硬盤的XML文檔中。           xElement.Save(_filePath);         }

上面的AddElement方法中,調用XElement對象的傳一個XElement對象的Add方法, 可以將一個XElement對象(節點)添加為一個已有節點的最后子節點。這樣我們通過Add的方式就可以輕易擴展一個節點的子節點。

下面調用增加新元素AddElement方法,將一個區的集合信息保存到Area.xml文檔中,然后打印XML樹。代碼如下:

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 = "天河區", Description = "天河區的描述"}, new District() {City = city, Name = "越秀區", Description = "越秀區的描述"}                                                                                                };              linqToXmlHelper.AddElement(districts);              XElement xElement = linqToXmlHelper.Load();              Console.WriteLine(xElement.ToString());  }

輸出結果如圖:

如何快速上手LINQ to XML

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

根據XElement類型提供的Elements方法,我們可以獲取某個節點的所有子節點元素,也可以通過傳入節點名稱為參數,獲取某個節點下所有和參數節點名稱相匹配的節點集合,可以根據XElement類型提供的Attibute方法獲取某節點的屬性信息,下面代碼示例根據城市名查詢該城市下所有的區的信息:

/// <summary>         /// 根據城市名查詢該城市下所有的區的信息          /// </summary>         /// <param name="cityName"></param>         /// <returns></returns>         public IList<District> GetDistricts(string cityName)          {              IList<District> districts = new List<District>();              XElement xElement = Load();              //獲取城市名為變量cityName的節點的所有子節點              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;          }

調用GetDistricts方法

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

輸出結果為:

天河區

越秀區

5)如何刪除XML文檔中的節點元素

刪除區的節點元素的方法,這里假定區的名稱是唯一的

/// <summary>         /// 刪除區的節點元素,這里假定區的名稱是唯一的          /// </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);           }

調用XElement.Remove方法可以在當前節點的父節點上刪除當前節點。下面代碼刪除區節點中名稱為“越秀區”的節點。

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

輸出結果為:

如何快速上手LINQ to XML

到這里,你已經看到了LINQ to XML技術操作XML最為常用一些功能,包括創建和加載XML文檔,新增刪除更新XML節點等。

關于如何快速上手LINQ to XML問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长葛市| 洞口县| 伊宁市| 安龙县| 木兰县| 达拉特旗| 北票市| 和田县| 新郑市| 潞城市| 仁寿县| 左云县| 安吉县| 商河县| 永福县| 德令哈市| 葫芦岛市| 漯河市| 孟津县| 平武县| 临泽县| 张掖市| 剑川县| 衡东县| 绥芬河市| 繁昌县| 宁都县| 连城县| 平湖市| 威宁| 神农架林区| 肥城市| 冀州市| 石屏县| 诏安县| 洱源县| 呼伦贝尔市| 富宁县| 新民市| 双鸭山市| 榕江县|