2017-03-06 53 views
0

我正在试图获取xml结构的深层次的节点。在c#中以递归方式查找xml节点

我的XML结构:

<Level1 name="data_reply"> 
    <Level2 name="name1"> 
    <level3 name="name2" /> 
    <Level3 name="name3 > 
     <Level4 name="name4"/> 
     <Level4 name="name5" someAttributes="blah blah"/> 
    </Level3> 
    <Level2 name="name6"/> 
    <Level2 name="name7"/> 
</Level1> 

我想用“5名”命名的节点和它的属性。问题是我想要得到这个节点,即使它更深或节点级别不同。名称属性可以被假定为唯一我的意思是我想是这样的:

var xmlDoc = new XmlDocument(); 
xmlDoc.Load("FileFullPath"); 
var wantedNode = xmlDoc.DocumentElement.GetNodeWithName("name5") // Which can be recursive or iterative 

我的方法签名可能是这样的:

public XmlNode GetNodeWithName(string nodeNameAttributeValue){ 
    ... Method content 
    return myNode 
} 

是否有任何安心使用方法也是这样吗?

回答

1

您可以使用System.Xml.Linq

var item = xmlDoc.Descendants() 
      .FirstOrDefault(node => (string)node.Attribute("name") == "name 5") 
2

您可以使用SelectNodes()SelectSingleNode(),它接受XPath expression作为参数。 XPath的支持表达查询找到任何名称的元素,在任何地方的XML文档,其中name属性值为“5名”:

var searchParam = "name 5"; 
var xpath = string.Format("//*[@name='{0}']", searchParam); 
var wantedNode = xmlDoc.SelectSingleNode(xpath);