在 C# 中以递归方式查找更深层次的 xml 节点
Find xml node in deeper levels recursively in 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>
我想获取以 "name 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
}
有这样的好用方法吗?
您可以使用 SelectNodes()
or SelectSingleNode()
which accept XPath expression 作为参数。 XPath 支持表达查询以在 XML 文档中的任何位置查找任何名称的元素,其中 name
属性值等于 "name 5" :
var searchParam = "name 5";
var xpath = string.Format("//*[@name='{0}']", searchParam);
var wantedNode = xmlDoc.SelectSingleNode(xpath);
您可以使用 System.Xml.Linq
:
var item = xmlDoc.Descendants()
.FirstOrDefault(node => (string)node.Attribute("name") == "name 5")
我正在尝试获取 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>
我想获取以 "name 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
}
有这样的好用方法吗?
您可以使用 SelectNodes()
or SelectSingleNode()
which accept XPath expression 作为参数。 XPath 支持表达查询以在 XML 文档中的任何位置查找任何名称的元素,其中 name
属性值等于 "name 5" :
var searchParam = "name 5";
var xpath = string.Format("//*[@name='{0}']", searchParam);
var wantedNode = xmlDoc.SelectSingleNode(xpath);
您可以使用 System.Xml.Linq
:
var item = xmlDoc.Descendants()
.FirstOrDefault(node => (string)node.Attribute("name") == "name 5")