【问题标题】:Removing empty elements without attributes from XML using C#?使用 C# 从 XML 中删除没有属性的空元素?
【发布时间】:2015-04-07 17:55:40
【问题描述】:

根据 StackOverflow 之前的回答,我使用以下语句删除所有空元素(具有属性的元素除外):

XDocument xdoc = XDocument.Parse(xmlString);

xdoc.Descendants()
    .Where(e => !e.HasAttributes && (e.IsEmpty || String.IsNullOrWhiteSpace(e.Value)))
    .Remove();

针对以下 XML 运行时:

<MESSAGE>
    <RELATIONSHIPS1>
        <RELATIONSHIP1 from="10017" to="1"/>
    </RELATIONSHIPS1>
    <RELATIONSHIPS2>
        <RELATIONSHIP2 from="10017" to="1"></RELATIONSHIP2>
    </RELATIONSHIPS2>
    <RELATIONSHIPS3>
        <RELATIONSHIP3 from="10017" to="1">test</RELATIONSHIP3>
    </RELATIONSHIPS3>
    <RELATIONSHIPS4 attr="test">
        <RELATIONSHIP4 from="10017" to="1"></RELATIONSHIP4>
    </RELATIONSHIPS4>
    <EXTENSION a1="1" a2="2"/>
    <FLOOD>
        <FLOOD_RESPONSE>
            <PROPERTY>
                <PROPERTY_DETAIL/>
                <PROPERTY_DETAIL></PROPERTY_DETAIL>
             </PROPERTY>
        </FLOOD_RESPONSE>
    </FLOOD>
</MESSAGE>

我期待以下内容:

<MESSAGE>
    <RELATIONSHIPS1>
        <RELATIONSHIP1 from="10017" to="1"/>
    </RELATIONSHIPS1>
    <RELATIONSHIPS2>
        <RELATIONSHIP2 from="10017" to="1"></RELATIONSHIP2>
    </RELATIONSHIPS2>
    <RELATIONSHIPS3>
        <RELATIONSHIP3 from="10017" to="1">test</RELATIONSHIP3>
    </RELATIONSHIPS3>
    <RELATIONSHIPS4 attr="test">
        <RELATIONSHIP4 from="10017" to="1"></RELATIONSHIP4>
    </RELATIONSHIPS4>
    <EXTENSION a1="1" a2="2" />
</MESSAGE>

但收到以下信息:

<MESSAGE>
  <RELATIONSHIPS3>
    <RELATIONSHIP3 from="10017" to="1">test</RELATIONSHIP3>
  </RELATIONSHIPS3>
  <RELATIONSHIPS4 attr="test">
    <RELATIONSHIP4 from="10017" to="1"></RELATIONSHIP4>
  </RELATIONSHIPS4>
  <EXTENSION a1="1" a2="2" />
</MESSAGE>

关于带有属性的嵌套空元素的任何想法正在被删除?

【问题讨论】:

标签: c# xml linq


【解决方案1】:

查看XElement.Value on MSDN的描述:

获取或设置该元素的拼接文本内容。

这意味着只返回内部元素的值(只有元素,而不是属性)。因此,例如在您的 XML 中,您有以下元素:

<RELATIONSHIPS1>
    <RELATIONSHIP1 from="10017" to="1"/>
</RELATIONSHIPS1>

这个元素的e.Value是空字符串,所以这个元素被移除了。

您可以运行此类查询来删除您不需要的元素。基本上,您需要检查具有空值且没有任何属性的元素,并且它的所有后代都具有空值且没有属性:

xdoc.Descendants()
    .Where(e => !e.HasAttributes && 
                string.IsNullOrEmpty(e.Value) &&
                e.Descendants().All(f=>String.IsNullOrEmpty(f.Value) && !f.HasAttributes))
    .Remove();

【讨论】:

  • 太棒了。但解决办法是什么?
  • 太棒了! Descendants() 为您执行递归,因此我对递归 LINQ 的评论是错误的。
  • 缺少Where 谓词String.IsNullOrEmpty(e.Value) &amp;&amp; 。
猜你喜欢
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 2018-05-05
相关资源
最近更新 更多