在XmlDocument中按名称搜索节点

14

我正在尝试使用以下代码在XmlDocument中按名称查找节点:

private XmlNode FindNode(XmlNodeList list, string nodeName)
{
    if (list.Count > 0)
    {
        foreach (XmlNode node in list)
        {
            if (node.Name.Equals(nodeName)) return node;
            if (node.HasChildNodes) FindNode(node.ChildNodes, nodeName);
        }
    }
    return null;
}

我使用以下方式调用该函数:

FindNode(xmlDocument.ChildNodes, "somestring");

出于某种原因它总是返回空值,我不太确定为什么。有人可以帮助我吗?


不仅仅是XmlDocument.GetElementsByTagName(nodeName)吗? - Marc K
2个回答

21

为什么不能使用

Node.SelectSingleNode(".//" + nodeName)

1
如果您的 XML 中已经定义了任何命名空间,那么您可能会遇到异常:需要使用命名空间管理器或 XsltContext。此查询具有前缀、变量或用户定义的函数。 - Daniel B

7

将此行更改为:

if (node.HasChildNodes) FindNode(node.ChildNodes, nodeName);

to:

if (node.HasChildNodes)
{
    XmlNode nodeFound = FindNode(node.ChildNodes, nodeName);
    if (nodeFound != null)
        return nodeFound;
}

编辑:代码现在更加正确(已测试);)


谢谢,伙计。错过了这么简单的东西有点傻。 - RajenK
1
有时候你越检查代码,修复的问题反而越少... :D - digEmAll
还有一个问题:如果我有一个带有多个路径的XML结构,例如:<a>   <b>     <c/>   </b>   <d>     <e/>   </d> </a> 使用上述方法似乎只能导航到第一个树(到c),但它无法找到e。这是我的代码预期的行为吗? - RajenK
抱歉,我没有仔细阅读你的评论。我已经编辑了帖子,现在更加正确(我也用你的样本进行了测试)。 - digEmAll
1
无论如何,我仍然建议您检查XPath导航是否符合您的需求http://support.microsoft.com/kb/308333 或者尝试使用LINQ to XML。 - digEmAll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接