从XmlNodeList中查找具有其属性的特殊节点

时间:2016-04-06 08:46:31

标签: c# .net xml winforms xmlnode

我有一个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>

4 个答案:

答案 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中,你当然可以使用表达式方法。)