Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#Linq到xml-提取子元素的父元素_C#_Linq To Xml - Fatal编程技术网

c#Linq到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

我有以下xml:

<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节点。而且这项任务不是一步到位的(如果可能的话)不必粗鲁,你一步到位吗?