2011-11-22 178 views
0

考虑下面的XML:递归地使用XPath递归地选择子节点?

<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期望它将接收整个Checks部的XML。

回答

2

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