Xelement将元素值添加到自身两次

时间:2016-04-19 04:35:40

标签: c# .net xml wpf linq

在我的代码中,我遍历一个xelement并让它返回该元素中每个节点的值,例如

foreach(XElement n in XDocument.Descedants("element_name)
 {
   Console.WriteLine("Searching: " n.Value);
 }

我的问题是字符串

中返回了两个<Directory>元素
Searching: C:\Users\215358\OneDrive\MusicC:\Users\215358\Dropbox\Music

我的XML文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Directories>
  <Directory>C:\Users\215358\OneDrive\Music</Directory>
  <Directory>C:\Users\215358\Dropbox\Music</Directory>
</Directories>

我希望它在<Directory>中输出第二行元素,如下所示:

C:\Users\215358\Dropbox\Music

为什么会这样?

2 个答案:

答案 0 :(得分:2)

XElement.Value获取concatenated text contents of an element。这包括子元素的文本,这些元素并不总是非常有用。如果您只想要当前元素的文本,可以在其子节点中找到文本节点。

foreach(XElement n in XDocument.Descedants("Directory"))
{
    var text = n.Nodes().Where (x => x is XText).Cast<XText>().FirstOrDefault ();
    if(text!=null){
        Console.WriteLine("Searching: " + text.Value);
    }else{
        Console.WriteLine("No text node found");
    }
}

答案 1 :(得分:0)

由于您想要遍历每个条目和搜索元素值,您可以执行类似的操作。

foreach (var element in doc.Descendants("Directory"))
{
     if((string)element.Value == "searchstring")
     {
          // your logic
     }  
}

如果您要在xml中查找第二个元素,可以应用Skip扩展名来跳过指定的元素数。

var secondelement = doc.Descendants("Directory").Skip(1); // Skip first element;

或者如果您正在寻找最后一个元素,可以LastLastOrDefault扩展。

var lastelement = doc.Descendants("Directory").LastOrDefault();

选中example