2013-12-13 76 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);