从 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 中,您当然可以使用表达式主体方法。)