使用XPath递归地选择子节点

本文关键字:选择 子节点 递归 XPath 使用 | 更新日期: 2023-09-27 18:15:33

给定以下XML:

<Checks>
   <IsSomethingCheck Param="1"/>
   <IsSomeoneCheck Param2="2"/>
   <Checks Operator="Or">
       <IsAnythingCheck Param3="3"/>
   </Checks>
</Checks>

如何递归遍历Checks元素的子元素?

下面的代码适用于最外层的子元素,但停止处理最内部的子元素(Checks内部元素的一部分)

protected override void InitializePlugin(XmlElement xmlElement)
{
    Enum.TryParse(xmlElement.GetAttribute("Operator"), out _operator);
    XPathNodeIterator nav = xmlElement.CreateNavigator().Select("Checks/*");
    foreach (XPathNavigator checkNode in nav)
    {
        if (_checksLookup.ContainsKey(checkNode.Name))
        {
            Type checkType = _checksLookup[checkNode.Name];
            Check check = Activator.CreateInstance(checkType) as Check;
            check.Initialize(checkNode.OuterXml);
            Checks.Add(check);
        }
    }    
}

PS:此方法的XmlElement期望它将接收XML的整个Checks部分

使用XPath递归地选择子节点

找到了!XPath表达式应该是/CheckManager/*,而不是CheckManager/*