从 XmlNodeList 中找到一个具有其属性的特殊节点
find a special node with its attribute from a XmlNodeList
我有一个 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>
你需要的是一个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;
}
你能试试这个吗,但如果你被允许,我建议使用 LINQ 来 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");
才能将其添加到列表中。
我猜就这些了,对我来说很好。
首先,//files/file
只有 returns 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();
}
正如您所说,您可以使用 LINQ 来 XML,我会使用这样的东西:
public List<XElement> FindElementsByName(XDocument doc, string name)
{
return doc.Descendants()
.Where(x => (string) x.Attribute("name") == name)
.ToList();
}
(在 C# 6 中,您当然可以使用表达式主体方法。)
我有一个 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>
你需要的是一个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;
}
你能试试这个吗,但如果你被允许,我建议使用 LINQ 来 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");
才能将其添加到列表中。
我猜就这些了,对我来说很好。
首先,//files/file
只有 returns 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();
}
正如您所说,您可以使用 LINQ 来 XML,我会使用这样的东西:
public List<XElement> FindElementsByName(XDocument doc, string name)
{
return doc.Descendants()
.Where(x => (string) x.Attribute("name") == name)
.ToList();
}
(在 C# 6 中,您当然可以使用表达式主体方法。)