微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

删除子节点保留其父节点

如何解决删除子节点保留其父节点

我有如下 XML 代码块(它是数百行类似行的一部分..):

<specs>
    <spec name='fald' value = '100'>
        <name></name>
        <value></value>
    </spec>
</specs>

我需要转换代码,如下所示:

  <specs>
     <spec name ='fald' value = '100'/>
  </specs>

使用以下代码我可以删除子节点:

foreach (XElement child in doc.Descendants().Reverse())
{
    if (child.HasAttributes)
    {
        foreach (var attribute in child.Attributes())
        {
            if (string.IsNullOrEmpty(attribute.Value) && string.IsNullOrEmpty(child.Value))
                child.Remove();
        }
    }
}

但是这个过程也会删除预计会在那里发生的父节点('spec')。任何帮助表示赞赏,谢谢...

解决方法

有点不清楚删除元素的标准是什么,但为了让您开始,也许这与您要查找的内容一致?

var xml =
    @"<specs>
        <spec name='fald' value='100'>
          <name></name>
          <value></value>
        </spec>
      </specs>";

var doc = XElement.Parse(xml);

var childrenToDelete = doc.XPathSelectElements("//spec/*")
    .Where(elem => string.IsNullOrEmpty(elem.Value)
            && (!elem.HasAttributes
            || elem.Attributes().All(attr => string.IsNullOrEmpty(attr.Value))))
    .ToList();

foreach (var child in childrenToDelete)
{
    child.Remove();
}

// Produces:
// <specs>
//   <spec name="fald" value="100" />
// </specs>

检查 this fiddle 以进行测试运行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。