C# 访问嵌套的子节点?
在使用xmltextreader一段时间后,我发现“使用linq”几乎可以解决这里所有与.net xml相关的问题,我决定尝试一下,到目前为止,它确实很好,但是我使用的文档有点奇怪,所以现在我遇到了一点问题 我工作的简化版本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> <
<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;})