c#Linq到xml-提取子元素的父元素
我有以下xml:c#Linq到xml-提取子元素的父元素,c#,linq-to-xml,C#,Linq To Xml,我有以下xml: <Root> <RootKey>1</RootKey> <ChildL1> <ChildL1Key>12</ChildL1Key> <Child2> <Child2Key>TakeMe</Child2Key> </Child2> <Child2> <Child2Key>36
<Root>
<RootKey>1</RootKey>
<ChildL1>
<ChildL1Key>12</ChildL1Key>
<Child2>
<Child2Key>TakeMe</Child2Key>
</Child2>
<Child2>
<Child2Key>365</Child2Key>
</Child2>
</ChildL1>
<ChildL1>
<ChildL1Key>95</ChildL1Key>
<Child2>
<Child2Key>958</Child2Key>
</Child2>
<Child2>
<Child2Key>574</Child2Key>
</Child2>
</ChildL1>
</Root>
1.
12
带走我
365
95
958
574
我需要提取Child2其中Child2Key==“TakeMe”的父项。结果将是:
<Root>
<RootKey>1</RootKey>
<ChildL1>
<ChildL1Key>12</ChildL1Key>
<Child2>
<Child2Key>TakeMe</Child2Key>
</Child2>
</ChildL1>
</Root>
1.
12
带走我
我大概可以分两步来做。从Child2向上遍历parent并获取它们的键,然后在下一步中使用其他键删除元素。如果可能的话,我宁愿在一个查询中完成
XDocument xdoc = XDocument.Load(path_to_xml);
xdoc.Descendants("Child2")
.Where(c2 => c2.Element("Child2Key").Value != "TakeMe")
.Remove();
xdoc.Descendants("ChildL1")
.Where(c1 => !c1.Descendants("Child2").Any())
.Remove();
// now xdoc contains what you need
string xml = xdoc.ToString();
第一个查询删除所有与搜索条件不匹配的Child2
节点
第二个查询将删除所有不再有Child2
节点的child1
特别适用于LB
xdoc.Descendants("ChildL1")
.Where(c1 => !c1.Descendants("Child2")
.Any(c2 => c2.Element("Child2Key").Value == "TakeMe"))
.Concat(xdoc.Descendants("Child2")
.Where(c2 => c2.Element("Child2Key").Value != "TakeMe"))
.Remove();
为什么要包括
child1key
元素和RootKey
元素?他们不是Child2Key的直系祖先,因为他们是Child2的父母的一部分,正如我说的,我需要提取。感谢您的支持。@Yoav您需要xml作为输出,还是只需要数据?@Yoav:RootKey
不是Child2
的父项的一部分,而是另一个Child2
的一部分。我以前没有否决过你的问题,但现在看来你无意澄清,我会的。请阅读并编辑您的问题。目前它是无法回答的模糊。我不知道如何才能更明确地给出预期的结果。注:我指的是家长,而不是家长。我大概可以分两步完成。。。。。。。如果可能的话,我宁愿在一个查询中完成。
仔细阅读问题:我可能可以分两步完成。从Child2向上遍历parent并获取它们的键,然后在下一步中使用其他键删除元素。如果可能的话,我宁愿在一次查询中完成我在第一步就做到了。而且它也不是完整的解决方案。OP需要第三步删除ChildL1节点。而且这项任务不是一步到位的(如果可能的话)不必粗鲁,你一步到位吗?