新聞中心
操作XML的技術(shù)有很多種:

1)DOM(Document Object Model,文檔對象模型),它為XML文檔提供了一個標(biāo)準(zhǔn)的解析。
2)XPath和XSLT,它們提供了查詢和格式化XML的功能。
3).NET框架中提供了一些對XML操作的類(在System.XML命名空間下)。
4)LINQ to XML。
在我看來有了LINQ to XML技術(shù),.NET中其它操縱XML的技術(shù)都可以棄而不用了,因?yàn)長INQ to XML操縱XML比其它技術(shù)都更簡單更方便也更直觀。
LINQ to XML 是基于LINQ的,所以可以使用LINQ的所有功能,如標(biāo)準(zhǔn)查詢操作符(詳細(xì)可閱讀《LINQ標(biāo)準(zhǔn)查詢操作符詳解》)和LINQ的編程接口。使用LINQ to XML可以很方便地將XML文件加載到內(nèi)存中,對XML文檔中的節(jié)點(diǎn)進(jìn)行查詢修改刪除等各種操作,然后又可以很方便地將操作后的XML文檔保存回磁盤。
System.Xml.Linq的命名空間中包含了LINQ to XML處理XML用到的所有類,共有19個類,如下所示。
類 說明
[[37481]]
Extensions 包含 LINQ to XML 擴(kuò)展方法。
[[37481]]
XAttribute 表示一個 XML 特性。
[[37481]]
XCData 表示一個包含 CDATA 的文本節(jié)點(diǎn)。
[[37481]]
XComment 表示一個 XML 注釋。
[[37481]]
XContainer 表示可包含其他節(jié)點(diǎn)的節(jié)點(diǎn)。
[[37481]]
XDeclaration 表示一個 XML 聲明。
[[37481]]
XDocument 表示 XML 文檔。
[[37481]]
XDocument Type表示 XML 文檔類型定義 (DTD)。
[[37481]]
XElement 表示一個 XML 元素。
[[37481]]
XName 表示 XML 元素或特性的名稱。
[[37481]]
XNamespace 表示一個 XML 命名空間。 此類不能被繼承。
[[37481]]
XNode 表示 XML 樹中節(jié)點(diǎn)的抽象概念(元素、注釋、文檔類型、處理指令或文本節(jié)點(diǎn))。
[[37481]]
XNodeDocumentOrderComparer 包含用于比較節(jié)點(diǎn)的文檔順序的功能。 無法繼承此類。
[[37481]]
XNodeEqualityComparer 比較節(jié)點(diǎn)以確定其是否相等。 無法繼承此類。
[[37481]]
XObject 表示 XML 樹中的節(jié)點(diǎn)或特性。
[[37481]]
XObjectChangeEventArgs 提供有關(guān) Changing 和 Changed 事件的數(shù)據(jù)。
[[37481]]
XProcessingInstruction 表示 XML 處理指令。
[[37481]]
XStreamingElement 表示支持延遲流輸出的 XML 樹中的元素。
[[37481]]
XText 表示一個文本節(jié)點(diǎn)。
這19個類提供了很多很多的方法,事實(shí)上很少人會在學(xué)習(xí)LINQ to XML的時候去學(xué)習(xí)每一種的方法的細(xì)節(jié),本文的目的是讓從來沒有使用過LINQ to XML的童鞋在需要使用LINQ to XML技術(shù)的時候快速上手,然后用之于自己的程序開發(fā)中,所以本文只講LINQ to XML處理XML類中最常用、用到最多的三個類,分別是XDocument、XElement和XAttribute。
XDocument類派生于XContainer類,因此它可以有子節(jié)點(diǎn),但XML的標(biāo)準(zhǔn)限制了XDocument對象只包含單個XElement子節(jié)點(diǎn),因?yàn)閄ML文檔只允許有一個根節(jié)點(diǎn)。
XDocument提供了處理有效XML文檔,包括聲明、注釋和處理指令。
XDocument 可以包含以下元素:
1)一個 XDeclaration 對象。 XDeclaration 使您能夠指定 XML 聲明的相關(guān)部分:XML 版本、文檔的編碼以及 XML 文檔是否是獨(dú)立的。
2)一個 XElement 對象。 這是 XML 文檔的根節(jié)點(diǎn)。
3)任意數(shù)目的 XProcessingInstruction 對象。 處理指令將信息傳遞給處理 XML 的應(yīng)用程序。
4)任意數(shù)目的 XComment 對象。 注釋將與根元素同級。 XComment 對象不能是列表中的***個參數(shù),因?yàn)?XML 文檔以注釋開頭無效。
5)一個用于 DTD 的 XDocumentType。
XDocument類提供的方法可參考MSDN文檔。
XElement派生自XContainer,而XContainer又派生于XNode類,所以一個元素也是一個節(jié)點(diǎn)。通過XElement可以創(chuàng)建XML的元素,添加和修改,移除元素以及子元素。
XElement類提供了很多方法,因?yàn)橐粋€XML文檔中最為核心的東西就是XElement,這些方法使得我們處理XML提供如囊中取物般簡單。
XElement類提供的方法可以參考MSDN文檔。
XAttribute派生于XObject類,不是派生于XNode類,所以XAttribute不能作為XML樹中的節(jié)點(diǎn),它是與XElement相關(guān)聯(lián)的名稱/值對,也就是XAttibute不能獨(dú)立于元素而存在。
XAttribute類提供的方法可參考MSDN文檔。
本文的重點(diǎn)是講述如何用LINQ to XML技術(shù)操縱XML文檔,包含如何創(chuàng)建一個XML文檔,如何保存XML文檔,如何遍歷XML文檔元素,如何查找XML文檔元素,如何更新XML文檔的元素,如何刪除XML文檔元素等,下面我們假設(shè)一個應(yīng)用場景來使用LINQ to XML技術(shù)來實(shí)現(xiàn)剛才所說的種種操作。
場景:將中國的省市區(qū)信息保存在一個XML文檔中,可以方便地對該文檔進(jìn)行各種操作,如查詢,更新,刪除元素等。
下面我們先創(chuàng)建省市區(qū)的相關(guān)類,如下:
- public class Province
- {
- ///
- /// 省份名稱
- ///
- public string Name { get; set; }
- ///
- /// 省會
- ///
- public string Capital { get; set; }
- }
- public class City
- {
- ///
- /// 城市名稱
- ///
- public string Name { get; set; }
- ///
- /// 城市編號
- ///
- public string Code { get; set; }
- public Province Province { get; set; }
- }
- public class District
- {
- ///
- /// 區(qū)名
- ///
- public string Name { get; set; }
- ///
- /// 描述
- ///
- public string Description { get; set; }
- public City City { get; set; }
- }
1)如何創(chuàng)建一個保存中國省市區(qū)信息的XML文檔。
使用LINQ to XML 創(chuàng)建一個XML文檔非常簡單,代碼如下:
- 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 類的新實(shí)例,然后調(diào)用XDocument的Save方法來生成一個XML文檔。很少使用XDocument來創(chuàng)建XML樹,通常是使用 XElement 根節(jié)點(diǎn)創(chuàng)建 XML 樹。除非具有創(chuàng)建文檔的具體要求(例如,必須在***創(chuàng)建處理指令和注釋,或者必須支持文檔類型),否則使用 XElement 作為根節(jié)點(diǎn)通常會更方便。運(yùn)行這段代碼,就會在生成的應(yīng)用程序根目錄下創(chuàng)建一個名為Area.xml的文檔,文檔內(nèi)容如下:
2)如何將一個XML樹加載到程序內(nèi)存。
我們操作一個XML文檔首先是需要將該文檔加載到程序的內(nèi)存中,在LINQ to XML中,通常是使用XElement類型的Load方法將XML文檔自根節(jié)點(diǎn)開始的XML樹加載到一個XElement類型的對象中,然后我們就可以采用XElement提供的各種方法對這個內(nèi)存中XML文檔進(jìn)行各種操作。
我們創(chuàng)建一個LINQtoXML的幫助類LinqToXmlHelper.cs,將對XML操作的相關(guān)方法都寫在這個類里面,下面是一個加載XML文檔到XElement對象的方法。
- ///
- /// 將Area.xml文檔加載到內(nèi)存中的XElement類型的對象xElement,成功調(diào)用 XElement.Load方法后會在xElement保存整棵XML樹
- ///
- ///
- public XElement Load()
- {
- XElement xElement = XElement.Load(_filePath);
- return xElement;
- }
我們剛才已經(jīng)創(chuàng)建了一個XML文檔,現(xiàn)在我們將這個文檔加載到內(nèi)存中,然后打印這個XElement對象。
- static void Main(string[] args)
- {
- LinqToXmlHelper linqToXmlHelper = new LinqToXmlHelper();
- var elements = linqToXmlHelper.Load();
- string str = elements.ToString();
- Console.WriteLine(str);
- Console.ReadKey();
- }
輸出結(jié)果如下:
3)如何向現(xiàn)有的XML文檔插入新的元素
到現(xiàn)在,我們已經(jīng)了解了LINQ to XML中創(chuàng)建和加載XML文檔的方式,接下來的問題就是如何向一個已經(jīng)存在的XML文檔添加新的節(jié)點(diǎn)。下面是增加新元素的方法,我們可以向Area.xml文檔中添加新是省份城市和區(qū)域信息,如果已經(jīng)存在的區(qū)域則進(jìn)行更新,這里用XElement的Save對更改后的XML文檔進(jìn)行保存。
- ///
- /// 增加新元素,如果要增加的區(qū)已經(jīng)存在,則對區(qū)的Description進(jìn)行更新
- ///
- ///
- public void AddElement(IList
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();
- //判斷該城市是否存在,不存在則在對應(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樹保存回硬盤的XML文檔中。
- xElement.Save(_filePath);
- }
上面的AddElement方法中,調(diào)用XElement對象的傳一個XElement對象的Add方法, 可以將一個XElement對象(節(jié)點(diǎn))添加為一個已有節(jié)點(diǎn)的最后子節(jié)點(diǎn)。這樣我們通過Add的方式就可以輕易擴(kuò)展一個節(jié)點(diǎn)的子節(jié)點(diǎn)。
下面調(diào)用增加新元素AddElement方法,將一個區(qū)的集合信息保存到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
districts = new List () - { 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é)果如圖:
4)如何查詢和遍歷XML文檔的元素
根據(jù)XElement類型提供的Elements方法,我們可以獲取某個節(jié)點(diǎn)的所有子節(jié)點(diǎn)元素,也可以通過傳入節(jié)點(diǎn)名稱為參數(shù),獲取某個節(jié)點(diǎn)下所有和參數(shù)節(jié)點(diǎn)名稱相匹配的節(jié)點(diǎn)集合,可以根據(jù)XElement類型提供的Attibute方法獲取某節(jié)點(diǎn)的屬性信息,下面代碼示例根據(jù)城市名查詢該城市下所有的區(qū)的信息:
- ///
- /// 根據(jù)城市名查詢該城市下所有的區(qū)的信息
- ///
- ///
- ///
- public IList
GetDistricts(string cityName) - {
- IList
districts = new List (); - XElement xElement = Load();
- //獲取城市名為變量cityName的節(jié)點(diǎn)的所有子節(jié)點(diǎn)
- IEnumerable
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
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ū)的名稱是唯一的
- ///
- /// 刪除區(qū)的節(jié)點(diǎn)元素,這里假定區(qū)的名稱是唯一的
- ///
- ///
- public void DeleteElement(IList
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
districts = new List (){new District(){Name = "越秀區(qū)"} }; - linqToXmlHelper.DeleteElement(districts);
- XElement xElement = linqToXmlHelper.Load();
- Console.WriteLine(xElement.ToString());
- Console.ReadKey();
- }
輸出結(jié)果為:
到這里,你已經(jīng)看到了LINQ to XML技術(shù)操作XML最為常用一些功能,包括創(chuàng)建和加載XML文檔,新增刪除更新XML節(jié)點(diǎn)等。
原文:http://www.cnblogs.com/zoupeiyang/archive/2011/07/25/2115941.html
【編輯推薦】
- Linq to xml操作XML
- XML之父解讀未來互聯(lián)網(wǎng)"游戲化"的三個真諦
- Ajax和Web服務(wù)數(shù)據(jù)格式:XML SOAP HTML
- 超強(qiáng)解析XML——簡單直接的來
- 解析PHP中的XML數(shù)據(jù)
網(wǎng)頁題目:新手如何快速上手LINQ to XML
文章地址:http://fisionsoft.com.cn/article/djhoidj.html


咨詢
建站咨詢
