我有一个XmlNodeList
想要在其中找到一个特殊节点。
我使用了下面的代码,但是我没有找到所需的节点,尽管它在XmlNodeList
中。
string ID = "9";
public void XMlNodeFind(XmlNodeList steps, string ID)
{
var resultNodes = new List<XmlNode>();
foreach (XmlNode node in steps)
{
if (node.Attributes["name"].Value.Equals(ID))
{
resultNodes.Add(node);
}
}
}
这是XML文件:
<?xml version="1.0" encoding="utf-8"?>
<files>
<file name="1">
<file name="3">
<file name="9">
</file>
</file>
</file>
<file name="2">
<text here are some text/>
</file>
</files>
答案 0 :(得分:1)
首先,//files/file
仅返回file
直接子 files
元素。如果您希望获得所有file
元素,无论它嵌套在files
中有多深,您都应该使用//
:
XmlNodeList steps = root1.SelectNodes("/files//file");
目前,您的函数将XmlAttribute
与字符串进行比较,字符串将始终计算为false
。所以,正如在另一个答案中所提到的,你应该比较价值。此外,借助LINQ:
public void XMlNodeFind(XmlNodeList steps, string ID)
{
var resultNodes = steps.Cast<XmlNode>()
.Where(o => o.Attributes["name"].Value.Equals(ID))
.ToList();
}
答案 1 :(得分:0)
您需要的是recursive
函数来遍历所有节点并找到匹配的节点。
public List<XmlNode> XMlNodeFind(XmlNodeList steps, string ID)
{
var resultNodes = new List<XmlNode>();
foreach (XmlNode node in steps)
{
if (node.Attributes != null && node.Attributes["name"] != null &&node.Attributes["name"].Value.Equals(ID))
{
resultNodes.Add(node);
}
resultNodes.AddRange(XMlNodeFind(node.ChildNodes, ID));
}
return resultNodes;
}
答案 2 :(得分:0)
你可以尝试这个,但如果你被允许,我建议使用LINQ to XML:
string ID = "9";
public void XMlNodeFind(XmlNodeList steps, string ID)
{
var resultNodes = new List<XmlNode>();
foreach (XmlNode node in steps)
{
if (node.Attributes["name"].Value.Equals(ID))
{
resultNodes.Add(node);
}
}
}
修改:1 强>
首先,您提供的信息不正确。您在steps
中没有特定节点,即使它存在于xml中。
您需要SelectNodes("/files//file");
才能将其列入清单。
这就是我想的,对我来说很好。
答案 3 :(得分:0)
正如您所说,您可以使用LINQ to XML,我会使用以下内容:
public List<XElement> FindElementsByName(XDocument doc, string name)
{
return doc.Descendants()
.Where(x => (string) x.Attribute("name") == name)
.ToList();
}
(在C#6中,你当然可以使用表达式方法。)