2013-12-13 121 views
2

我試圖從xml文檔中獲取給定值「John」的所有元素。LINQ to XML:如何獲取所有元素的值

LINQ to XML有可能嗎?

我想實現的是用「Wayne」替換所有「John」值。我知道這可以很容易地用xslt完成,但我需要通過代碼來完成。

我的XML:

<Root> 
    <Parents> 
    <Parent> 
     <Name>John</Name> 
     <Age>18</Age> 
    </Parent> 
    <Parent> 
     <Name>John</Name> 
     <Age>25</Age> 
    </Parent> 
    <Parent> 
     <Name>Peter</Name> 
     <Age>31</Age> 
    </Parent> 
    </Parents> 
</Root> 

我已經試過這樣:

XmlDocument doc = new XmlDocument(); 
doc.Load(@"C:/Temp/test.xml"); 

var elements = doc.Elements().Where(w => w.Value == "John"); 
foreach (var element in elements) 
{ 
    element.Value = "Wayne"; 
} 
+1

僅供參考,這是不這樣做的理由,你想要的東西是因爲元素()只會包含根,其val你不是「約翰」。 – Casey

回答

4

您可以使用System.Xml.Linq.XDocument。與其合作更容易。

XDocument doc = XDocument.Load(your file path); 

var elements = doc.Descendants("Name").Where(i => i.Value == "John"); 

foreach (var element in elements) 
{ 
    element.Value = "Wayne"; 
} 

doc.Save(your save file path); 

這裏是輸出:

<?xml version="1.0" encoding="utf-8"?> 
<Root> 
    <Parents> 
    <Parent> 
     <Name>Wayne</Name> 
     <Age>18</Age> 
    </Parent> 
    <Parent> 
     <Name>Wayne</Name> 
     <Age>25</Age> 
    </Parent> 
    <Parent> 
     <Name>Peter</Name> 
     <Age>31</Age> 
    </Parent> 
    </Parents> 
</Root> 
+0

非常感謝!這正是我所需要的。 – bale3

+0

這與問題有點不同,不是嗎?他表示所有具有John值的元素,但您只是使用John值搜索Name元素。 – Casey

+0

@emodendroket是的,但我認爲他有這個想法,並能夠找出如何解決類似問題 –

0

這裏有一個方法,將獲得與價值約翰的所有元素,無論什麼元素(雖然只在同一水平,你必須修改一下不同層次過多,你可以用後代的方法如前所述):

XDocument doc = XDocument.Load(@"C:\temp\test.xml"); 

    var ns = doc.Root.GetDefaultNamespace(); 
    var elements = doc.Element(ns + "Root").Element(ns + "Parents").Elements(ns + "Parent").Elements().Where(w => w.Value == "John"); 
    foreach (var element in elements) 
    { 
    element.Value = "Wayne"; 
    } 

    var stream = new FileStream(@"C:\temp\test.xml", FileMode.Create); 

    doc.Save(stream);