根据子条件删除父节点

时间:2015-06-17 15:50:28

标签: c# xml linq linq-to-xml

我需要帮助来根据某些条件删除xml节点

这是我的xml

<result>
<product>
<auto>
  <report>
    <auto>
      <admin></admin>
      <report>
        <search>
          <subjects>
            <subject>
              <name>
                <first>John</first>
                <last>D</last>
              </name>
            </subject>
          </subjects>
        </search>
      </report>
    </auto>
  </report>
</auto>
<auto>
  <report>
    <auto>
      <admin></admin>
      <report>
        <search>
          <subjects>
            <subject>
              <name>
                <first>Jack</first>
                <last>L</last>
              </name>
            </subject>
          </subjects>
        </search>
      </report>
    </auto>
  </report>
</auto>
</product>
</result>

在这个xml之外,根据名字和姓氏删除其余的&#34; auto&#34;节点

保持&#34;自动&#34;节点如果名字=约翰和姓氏= D

预期xml:

<result>
<product>
<auto>
  <report>
    <auto>
      <admin></admin>
      <report>
        <search>
          <subjects>
            <subject>
              <name>
                <first>John</first>
                <last>D</last>
              </name>
            </subject>
          </subjects>
        </search>
      </report>
    </auto>
  </report>
</auto>  
</product>
</result>

我想先通过

提取所需的内容
  var query =
  from p in XDocument.Parse(myXml).Root.Elements   ("result/product/auto/report/auto/report/search/subjects/subject/name")
  where (
  from c in p.Elements("first")
  where c.Value == "John"
  select c
  ).Any()
  select p;
     

请在这里建议我。

1 个答案:

答案 0 :(得分:2)

如果我理解正确的话:

    string first = "John";
    string last = "D";
    XDocument xd = XDocument.Parse(xml);
    xd.Root.Element("product").Elements("auto").ToList()
        .ForEach(x=>
            {
            var name = x.Descendants("name").First();
            if (name.Element("first").Value != first
                && name.Element("last").Value != last)
                x.Remove();
            });
    Console.WriteLine(xd);

打印:

<result>
  <product>
    <auto>
      <report>
        <auto>
          <admin></admin>
          <report>
            <search>
              <subjects>
                <subject>
                  <name>
                    <first>John</first>
                    <last>D</last>
                  </name>
                </subject>
              </subjects>
            </search>
          </report>
        </auto>
      </report>
    </auto>
  </product>
</result>

链接: https://dotnetfiddle.net/ZZ2Hlr