C# 访问嵌套的子节点?

C# 访问嵌套的子节点?,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,在使用xmltextreader一段时间后,我发现“使用linq”几乎可以解决这里所有与.net xml相关的问题,我决定尝试一下,到目前为止,它确实很好,但是我使用的文档有点奇怪,所以现在我遇到了一点问题 我工作的简化版本 <a> <b name="..." id="."> <c id="..." type="..."> <value_I_want>.....</value_I_want> <

在使用xmltextreader一段时间后,我发现“使用linq”几乎可以解决这里所有与.net xml相关的问题,我决定尝试一下,到目前为止,它确实很好,但是我使用的文档有点奇怪,所以现在我遇到了一点问题

我工作的简化版本

<a>
  <b name="..." id=".">
    <c id="..." type="...">
        <value_I_want>.....</value_I_want>
    </c>
    <c id="..." type="...">
        <value_I_want>.....</value_I_want>
    </c>

.....
.....
我需要查询'a'来获取'c'的每个实例的属性和元素-我不能查询'b',因为它不是唯一的,并且会返回一堆不相关的东西

我可能应该提到,“a”元素不是文档的最终根


有什么想法吗?

您可以使用Linq查询一次选择所有
'c'
元素:

XDocument doc = XDocument.Load("<yourxml/>"); 
var c_elements = doc.Descendants("a")
                    .Descendants("b")
                    .Descendants("c);
XDocument doc=XDocument.Load(“”);
var c_elements=文件子体(“a”)
.后代(“b”)
.后代(“c”);

现在,您可以从提取属性或选择任何子节点中执行任何操作。

您可以使用Linq查询一次选择所有
'c'
元素:

XDocument doc = XDocument.Load("<yourxml/>"); 
var c_elements = doc.Descendants("a")
                    .Descendants("b")
                    .Descendants("c);
XDocument doc=XDocument.Load(“”);
var c_elements=文件子体(“a”)
.后代(“b”)
.后代(“c”);
现在,从提取属性或选择任何子节点中执行任何操作。

使用linq;-)

您希望使用“子体”方法而不是“元素”方法。大概是这样的:

        var xdoc = XDocument.Load("<yourxml/>"); 
        var celes = xdoc.Descendants("a").Descendants("c"); 
var xdoc=XDocument.Load(“”);
var celes=xdoc.后代(“a”).后代(“c”);
这将首先找到所有元素“a”,然后在该集合中查找所有元素“c”。这可能不是你想要的。为确保您拥有正确的亲子关系,您可以这样做:

        var xdoc = XDocument.Load("<yourxml/>");
        var celes = xdoc.Descendants("c")
                        .Where(x => (x.Parent != null) && (x.Parent.Name == "b"))
                        .Where(x => (x.Parent.Parent != null) && (x.Parent.Parent.Name == "a"));
var xdoc=XDocument.Load(“”);
var celes=xdoc.substands(“c”)
。其中(x=>(x.Parent!=null)&&(x.Parent.Name==“b”))
。其中(x=>(x.Parent.Parent!=null)&&(x.Parent.Parent.Name==“a”);
使用linq;-)

您希望使用“子体”方法而不是“元素”方法。大概是这样的:

        var xdoc = XDocument.Load("<yourxml/>"); 
        var celes = xdoc.Descendants("a").Descendants("c"); 
var xdoc=XDocument.Load(“”);
var celes=xdoc.后代(“a”).后代(“c”);
这将首先找到所有元素“a”,然后在该集合中查找所有元素“c”。这可能不是你想要的。为确保您拥有正确的亲子关系,您可以这样做:

        var xdoc = XDocument.Load("<yourxml/>");
        var celes = xdoc.Descendants("c")
                        .Where(x => (x.Parent != null) && (x.Parent.Name == "b"))
                        .Where(x => (x.Parent.Parent != null) && (x.Parent.Parent.Name == "a"));
var xdoc=XDocument.Load(“”);
var celes=xdoc.substands(“c”)
。其中(x=>(x.Parent!=null)&&(x.Parent.Name==“b”))
。其中(x=>(x.Parent.Parent!=null)&&(x.Parent.Parent.Name==“a”);

.substands
返回一个
IEnumerable
,因此不需要
.OfType()
。@ZevSpitz谢谢。编辑过。我不知道你能像那样链接后代方法,效果很好。谢谢。
.subjects
返回一个
IEnumerable
,因此不需要
.OfType()
。@ZevSpitz谢谢。编辑过。我不知道你能像那样链接后代方法,效果很好。非常感谢。具有返回所有祖先的方法。要检查第一个和第二个父级,可以执行以下操作:
。其中(x=>{var l=x.祖先。Take(2).ToList();return l.Count==2&&l[0]。Name==b&&l[1]。Name==a;})
有一个方法,返回所有祖先。要检查第一个和第二个父级,可以执行以下操作:
.Where(x=>{var l=x.祖先.Take(2).ToList();return l.Count==2&&l[0]。Name==b&l[1]。Name==a;})