一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

Linq To Xml學(xué)習(xí) - 3.查詢、更新、刪除

Linq To Xml學(xué)習(xí) - 3.查詢、更新、刪除

文章最后有該示例的XML文檔。

查找具有特定屬性的元素

XElement root = XElement.Load("PurchaseOrder.xml");IEnumerable address =    from el in root.Elements("Address")    where (string)el.Attribute("Type") == "Billing"    select el;foreach (XElement el in address)    Console.WriteLine(el);

輸出為:

<Address Type="Billing">  <Name>Tai YeeName>  <Street>8 Oak AvenueStreet>  <City>Old TownCity>  <State>PAState>  <Zip>95819Zip>  <Country>USACountry>Address>

內(nèi)存中 XML 樹修改與函數(shù)構(gòu)造

就地修改 XML 樹是更改 XML 文檔形狀的傳統(tǒng)方法。 典型的應(yīng)用程序?qū)⑽臋n加載到數(shù)據(jù)存儲區(qū)(如 DOM 或 LINQ to XML);使用編程接口插入節(jié)點(diǎn)、刪除節(jié)點(diǎn)或更改節(jié)點(diǎn)的內(nèi)容;然后將 XML 保存到文件或通過網(wǎng)絡(luò)傳輸。

LINQ to XML 允許使用另一種可在許多方案中使用的方法:函數(shù)構(gòu)造。 函數(shù)構(gòu)造將修改數(shù)據(jù)視為轉(zhuǎn)換問題,而不是數(shù)據(jù)存儲區(qū)的具體操作。 如果您采用某種數(shù)據(jù)表示形式并有效地將其從一種形式轉(zhuǎn)換為另一種形式,其結(jié)果等效于您采用一個數(shù)據(jù)存儲區(qū)并對其以某種方式進(jìn)行操作以采用另一種形狀。 函數(shù)構(gòu)造方法的關(guān)鍵是將查詢的結(jié)果傳遞給 XDocument 和 XElement 構(gòu)造函數(shù)。

此示例假設(shè)您想修改下面的簡單 XML 文檔,使屬性變?yōu)樵亍?本節(jié)首先介紹傳統(tǒng)的就地修改方法。 然后顯示函數(shù)構(gòu)造方法。XML文件:

xml version="1.0" encoding="utf-8" ?><Root Data1="123" Data2="456">  <Child1>ContentChild1>Root>

您可以編寫一些過程代碼以便從屬性創(chuàng)建元素,然后刪除屬性,如下所示:

XElement root = XElement.Load("Data.xml");foreach (XAttribute att in root.Attributes()) {    root.Add(new XElement(att.Name, (string)att));}root.Attributes().Remove();Console.WriteLine(root);

輸出結(jié)果為:

<Root>  <Child1>ContentChild1>  <Data1>123Data1>  <Data2>456Data2>Root>

函數(shù)構(gòu)造方法

相比之下,函數(shù)方法包含用于形成新樹的代碼、從源樹中選擇元素和屬性并在將其添加到新樹中時進(jìn)行相應(yīng)的轉(zhuǎn)換。 函數(shù)方法如下所示:

XElement root = XElement.Load("Data.xml");XElement newTree = new XElement("Root",    root.Element("Child1"),    from att in root.Attributes()    select new XElement(att.Name, (string)att));Console.WriteLine(newTree);

在本例中,函數(shù)示例一點(diǎn)也不比第一個示例簡短,而且一點(diǎn)也不比第一個示例簡單。 但如果要對一個 XML 樹進(jìn)行很多更改,則非函數(shù)方法將變得非常復(fù)雜,而且會顯得很笨拙。 相比之下,使用函數(shù)方法時,您只需形成所需的 XML,嵌入適當(dāng)?shù)牟樵兒捅磉_(dá)式以提取需要的內(nèi)容。 函數(shù)方法生成的代碼更易于維護(hù)。

請注意,在本例中,函數(shù)方法的執(zhí)行效果可能沒有樹操作方法好。 主要問題是函數(shù)方法創(chuàng)建了更多短生存期的對象。 但是,如果使用函數(shù)方法能夠提高程序員的效率,則折中也是一種有效的方式。

這是一個很簡單的示例,但它顯示了這兩種方法之間基本原理上的差異。 對于轉(zhuǎn)換較大的 XML 文檔,函數(shù)方法可以產(chǎn)生更高的效率增益。

 

向 XML 樹中添加元素、屬性和節(jié)點(diǎn)

下面的方法將子內(nèi)容添加到 XElement 或 XDocument 中:

方法                 說明

Add                  在 XContainer 的子內(nèi)容的末尾添加內(nèi)容。

AddFirst           在 XContainer 的子內(nèi)容的開頭添加內(nèi)容。

下面的方法將內(nèi)容添加為 XNode 的同級節(jié)點(diǎn)。 向其中添加同級內(nèi)容的最常見的節(jié)點(diǎn)是 XElement,不過你也可以將有效的同級內(nèi)容添加到其他類型的節(jié)點(diǎn),例如 XText 或 XComment。

方法                         說明

AddAfterSelf            在 XNode 后面添加內(nèi)容。

AddBeforeSelf          在 XNode 前面添加內(nèi)容。

示例:

XElement srcTree = new XElement("Root",     new XElement("Element1", 1),    new XElement("Element2", 2),    new XElement("Element3", 3),    new XElement("Element4", 4),    new XElement("Element5", 5));XElement xmlTree = new XElement("Root",    new XElement("Child1", 1),    new XElement("Child2", 2),    new XElement("Child3", 3),    new XElement("Child4", 4),    new XElement("Child5", 5));xmlTree.Add(new XElement("NewChild", "new content"));xmlTree.Add(    from el in srcTree.Elements()    where (int)el > 3    select el);// Even though Child9 does not exist in srcTree, the following statement will not// throw an exception, and nothing will be added to xmlTree.xmlTree.Add(srcTree.Element("Child9"));Console.WriteLine(xmlTree);

輸出結(jié)果:

<Root>  <Child1>1Child1>  <Child2>2Child2>  <Child3>3Child3>  <Child4>4Child4>  <Child5>5Child5>  <NewChild>new contentNewChild>  <Element4>4Element4>  <Element5>5Element5>Root>

 

修改 XML 樹中的元素、屬性和節(jié)點(diǎn)

下表匯總了修改元素、元素的子元素或元素屬性 (Attribute) 時可以使用的方法和屬性 (Property)。

下面的方法修改 XElement。

方法

說明

XElement..::.Parse

用已分析的 XML 替換元素。

XElement..::.RemoveAll

移除元素的所有內(nèi)容(子節(jié)點(diǎn)和屬性)。

XElement..::.RemoveAttributes

移除元素的屬性。

XElement..::.ReplaceAll

替換元素的所有內(nèi)容(子節(jié)點(diǎn)和屬性)。

XElement..::.ReplaceAttributes

替換元素的屬性。

XElement..::.SetAttributeValue

設(shè)置屬性的值。 如果該屬性不存在,則創(chuàng)建該屬性。 如果值設(shè)置為 null,則移除該屬性。

XElement..::.SetElementValue

設(shè)置子元素的值。 如果該元素不存在,則創(chuàng)建該元素。 如果值設(shè)置為 null,則移除該元素。

XElement..::.Value

用指定的文本替換元素的內(nèi)容(子節(jié)點(diǎn))。

XElement..::.SetValue

設(shè)置元素的值。

 XElement.SetElementValue 方法

此方法旨在簡化將名稱/值對列表用作子元素集時的維護(hù)。維護(hù)列表時,需要添加對、修改對或刪除對。如果調(diào)用此方法將不存在的名稱作為子元素傳遞,則此方法會為您創(chuàng)建一個子元素。如果您調(diào)用此方法來傳遞一個現(xiàn)有子元素的名稱,則此方法會將此子元素的值更改為指定的值。如果您為 value 傳遞了 nullNothingnullptrnull 引用(在 Visual Basic 中為 Nothing),則此方法會移除子元素。

// Create an element with no contentXElement root = new XElement("Root");// Add some name/value pairs.root.SetElementValue("Ele1", 1);root.SetElementValue("Ele2", 2);root.SetElementValue("Ele3", 3);Console.WriteLine(root);// Modify one of the name/value pairs.root.SetElementValue("Ele2", 22);Console.WriteLine(root);// Remove one of the name/value pairs.root.SetElementValue("Ele3", null);Console.WriteLine(root);

輸出結(jié)果:

<Root>  <Ele1>1Ele1>  <Ele2>2Ele2>  <Ele3>3Ele3>Root><Root>  <Ele1>1Ele1>  <Ele2>22Ele2>  <Ele3>3Ele3>Root><Root>  <Ele1>1Ele1>  <Ele2>22Ele2>Root>

 

XElement.SetAttributeValue 方法

此方法旨在簡化將名稱/值對列表用作屬性集時的維護(hù)。維護(hù)列表時,需要添加對、修改對或刪除對。如果調(diào)用此方法將不存在的名稱作為屬性傳遞,則此方法會為您創(chuàng)建一個屬性。如果調(diào)用此方法來傳遞現(xiàn)有屬性的名稱,則此方法將會屬性的值修改為指定的值。如果您為 value 傳遞了 nullNothingnullptrnull 引用(在 Visual Basic 中為 Nothing),則此方法會移除該屬性。

此方法將引發(fā) ChangedChanging 事件。

將值分配給具有指定名稱的屬性。如果不存在具有指定名稱的屬性,則添加新屬性。如果值為 nullNothingnullptrnull 引用(在 Visual Basic 中為 Nothing),則刪除具有指定名稱的屬性(如果存在)。

// Create an element with no content.XElement root = new XElement("Root");// Add some name/value pairs.root.SetAttributeValue("Att1", 1);root.SetAttributeValue("Att2", 2);root.SetAttributeValue("Att3", 3);Console.WriteLine(root);// Modify one of the name/value pairs.root.SetAttributeValue("Att2", 22);Console.WriteLine(root);// Remove one of the name/value pairs.root.SetAttributeValue("Att3", null);Console.WriteLine(root);

輸出結(jié)果為:

<Root Att1="1" Att2="2" Att3="3" /><Root Att1="1" Att2="22" Att3="3" /><Root Att1="1" Att2="22" />

XNode.ReplaceWith 方法

使用指定的內(nèi)容替換此節(jié)點(diǎn)。

XElement xmlTree = new XElement("Root",    new XElement("Child1", "child1 content"),    new XElement("Child2", "child2 content"),    new XElement("Child3", "child3 content"),    new XElement("Child4", "child4 content"),    new XElement("Child5", "child5 content"));XElement child3 = xmlTree.Element("Child3");child3.ReplaceWith(    new XElement("NewChild", "new content"));Console.WriteLine(xmlTree);

輸出結(jié)果:

<Root>  <Child1>child1 contentChild1>  <Child2>child2 contentChild2>  <NewChild>new contentNewChild>  <Child4>child4 contentChild4>  <Child5>child5 contentChild5>Root>

從 XML 樹中移除元素、屬性和節(jié)點(diǎn)

可以修改 XML 樹,移除元素、屬性和其他類型的節(jié)點(diǎn)。

從 XML 文檔中移除單個元素或單個屬性的操作非常簡單。 但是,若要移除多個元素或?qū)傩缘募希瑒t應(yīng)首先將一個集合具體化為一個列表,然后從該列表中刪除相應(yīng)元素或?qū)傩浴?最好的方法是使用 Remove 擴(kuò)展方法,該方法可以實(shí)現(xiàn)此操作。

這么做的主要原因在于,從 XML 樹檢索的大多數(shù)集合都是用延遲執(zhí)行生成的。 如果不首先將集合具體化為列表,或者不使用擴(kuò)展方法,則可能會遇到某類 Bug。

image

示例:

此示例演示三種移除元素的方法。 第一種,移除單個元素。 第二種,檢索元素的集合,使用 Enumerable.ToList<(Of <(TSource>)>) 運(yùn)算符將它們具體化,然后移除集合。 最后一種,檢索元素的集合,使用 Remove 擴(kuò)展方法移除元素。

XElement root = XElement.Parse(@" ");root.Element("Child1").Element("GrandChild1").Remove();root.Element("Child2").Elements().ToList().Remove();root.Element("Child3").Elements().Remove();Console.WriteLine(root);

輸出結(jié)果為:

<Root>  <Child1>    <GrandChild2 />    <GrandChild3 />  Child1>  <Child2 />  <Child3 />Root>

it知識庫Linq To Xml學(xué)習(xí) - 3.查詢、更新、刪除,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 91在线播放视频 | 加勒比精品 | 欧美又黄又嫩大片a级 | 亚洲精品亚洲人成毛片不卡 | 久久一| 91在线麻豆| 色欧美在线视频 | 精品久久看| 911国产自产精品a | 国产狂喷冒白浆免费视频 | 91精品福利一区二区 | 六月色天 | 国产区在线观看视频 | 国产免费一区二区三区最新 | 天天舔天天舔 | 一级做a爰片性色毛片黄书 一级做a爰片性色毛片男 | 精品国内自产拍在线视频 | 伊人网在线播放 | 9久热这里只有精品免费 | 97精品国产自在现线免费观看 | 亚洲黄色高清视频 | 91频视| 青热久思思 | 亚洲小说图片 | 悠悠色综合 | 日本欧美一区二区三区高清 | 高清一区二区三区 | 欧洲精品在线视频 | 秋霞伊人网 | 中文字幕亚洲一区二区v@在线 | 国产精品视频999 | 国产成人亚洲综合无 | 最新国产精品精品视频 | 日本一区免费在线 | 色婷婷亚洲十月十月色天 | 婷婷午夜影院 | 99pao成人国产永久免费视频 | 精品99久久| 最新国产精品精品视频 | 深夜福利一区二区 | 国产大片黄在线观看 |