在XML文档中使用C#从不同分支的父节点检索叶子

在XML文档中使用C#从不同分支的父节点检索叶子,c#,xml,C#,Xml,从一个包含数千个可变嵌套节点(最多10层)的XML文档中 希望仅以编程方式检索属于任何“P”父级的叶 如下所示:例如,在上面的示例中,选择P2“AA”将产生l_A到l_F,而P3“BBB”将产生l_D到l_F。类似这样的内容(返回字符串列表): 如果Text属性始终存在,则可以删除属性null检查…一种方法是通过XmlDocument使用XPath(如果不使用LINQ) 您的XPath可能如下所示: XDocument doc = XDocument.Load(@"test.xml");

从一个包含数千个可变嵌套节点(最多10层)的XML文档中 希望仅以编程方式检索属于任何“P”父级的叶 如下所示:例如,在上面的示例中,选择P2“AA”将产生l_A到l_F,而P3“BBB”将产生l_D到l_F。

类似这样的内容(返回字符串列表):

如果
Text
属性始终存在,则可以删除属性null检查…

一种方法是通过
XmlDocument
使用XPath(如果不使用LINQ)

您的XPath可能如下所示:

    XDocument doc = XDocument.Load(@"test.xml");

    string level = "P3";
    string levelAttr = "AAA";

    var list = (from d in doc.Descendants(level)
                let xAttribute = d.Attribute("Text")
                where xAttribute != null && xAttribute.Value == levelAttr
                from l in d.Descendants("L")
                let lAttribute = l.Attribute("Text")
                where lAttribute != null
                select lAttribute.Value);
//P2[@Text='AA']//L/@Text
您的代码如下所示:

    XDocument doc = XDocument.Load(@"test.xml");

    string level = "P3";
    string levelAttr = "AAA";

    var list = (from d in doc.Descendants(level)
                let xAttribute = d.Attribute("Text")
                where xAttribute != null && xAttribute.Value == levelAttr
                from l in d.Descendants("L")
                let lAttribute = l.Attribute("Text")
                where lAttribute != null
                select lAttribute.Value);
//P2[@Text='AA']//L/@Text
xml文档//初始化并加载它
静态列表GetLeavesText(int-pLevel/*2*/,string-pText/*AA*/)
{
var result=新列表();
//加载的文档
var nodeList=document.SelectNodes(String.Format(@//P{0}[@Text='{1}']///L/@Text”,pLevel,pText));
if(节点列表!=null)
foreach(节点列表中的XmlNode)
{
Add(xmlNode.InnerText);
}
返回结果;
}

最初的想法是使用XPath并检查其中是否存在父标识符,但不幸的是父标识符不是唯一的,只有文本属性是唯一的。当涉及1000多个节点时,检查Xpath中每个节点的属性非常麻烦。我想知道是否有一个更有效的方法…工作完美!伟大的多刺