【问题标题】:find a special node with its attribute from a XmlNodeList从 XmlNodeList 中找到具有其属性的特殊节点
【发布时间】:2016-07-26 13:13:09
【问题描述】:

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

【问题讨论】:

  • 您最初是如何填充XmlNodeList 的?
  • XmlNodeList steps = root1.SelectNodes("//files/file");
  • 还有,resultNodes不是XMlNodeFind()返回的,那你是怎么查看结果的呢?
  • 我知道它没有回报。但是resultNodesnull 直到foreach 结束。
  • 顺便说一句,您是否可以使用 LINQ to XML 而不是 XmlDocument 等?它通常使这样的事情变得微不足道。

标签: c# .net xml winforms xmlnode


【解决方案1】:

你需要的是一个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;
}

【讨论】:

  • 你需要.Value
【解决方案2】:

你可以试试这个吗,但如果允许的话,我建议你使用 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】:

首先,//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();
}

【讨论】:

    【解决方案4】:

    正如你所说,你可以使用 LINQ to XML,我会使用这样的东西:

    public List<XElement> FindElementsByName(XDocument doc, string name)
    {
        return doc.Descendants()
                  .Where(x => (string) x.Attribute("name") == name)
                  .ToList();
    }
    

    (在 C# 6 中,您当然可以使用表达式主体方法。)

    【讨论】:

    • 感谢您的回答。请将() 添加到doc.Descendants
    • @SaberJalilzadeh:完成。
    猜你喜欢
    • 2023-04-02
    • 2015-05-18
    • 1970-01-01
    • 2013-06-02
    • 2020-06-11
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多