在我的代码中,我遍历一个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
为什么会这样?
答案 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;
或者如果您正在寻找最后一个元素,可以Last
或LastOrDefault
扩展。
var lastelement = doc.Descendants("Directory").LastOrDefault();
选中example
。