【问题标题】:How to remove all empty elements from an xml file using C#? [duplicate]如何使用 C# 从 xml 文件中删除所有空元素? [复制]
【发布时间】:2012-06-18 05:39:26
【问题描述】:

如何使用 C# 从 XML 文件中删除所有空元素?

例如:

输入

<Person>
  <PersonDetails>
    <Name>Some Name</Name>
    <Address>
      <Street>Some Street</Street>
      <City>Some City</City>
      <Zip/>
    </Address>
 </PersonDetails>
 <PersonDetails>
    <Name>Some Name</Name>
    <Address/>
 </PersonDetails>
 <PersonDetails/>
</Person>

输出

<Person>
  <PersonDetails>
    <Name>Some Name</Name>
    <Address>
      <Street>Some Street</Street>
      <City>Some City</City>
    </Address>
 </PersonDetails>
 <PersonDetails>
    <Name>Some Name</Name>
 </PersonDetails>
</Person>

【问题讨论】:

  • 欢迎使用 StackOverflow:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ({ } ) 在编辑器工具栏上很好地格式化和语法高亮它!无需“破坏”您的 XML,也无需大量的 &lt;br /&gt; 标签 - 只需对其进行格式化!
  • @marc_s:很酷,从来没有注意到这一点。我总是输入四个额外的空格,或者只是在发布之前在 VS2010 中缩进我的代码。
  • 你想从里到外递归删除空元素吗?例如,如果 PersonDetail 中的所有元素都是空的,是否也要删除 PersonDetail 元素?

标签: c# xml


【解决方案1】:

根据您更新的问题,您可以使用 XPath 单线来获得您所追求的:

var doc = XElement.Parse(source);  // or XElement.Load(filename) if coming from a file   

doc.XPathSelectElements("//*[string-length() = 0]").ToList().Remove();

doc.Save(filename)                 // or doc.ToString() if you want the string output

如果您不想使用 XPath,可以使用Descendants() 和 LINQ:

doc.Descendants().ToList().Where(d => d.Value.Length == 0).Remove();

ToList() 在这两种情况下都是必要的,以确保您没有就地修改枚举。

【讨论】:

  • 感谢这个作品。但它不会删除元素内的空元素(层次结构)。我的情况是,我将获得具有不同结构的不同 xml 文件。有什么方法可以从任何类型的 XML 结构中删除空元素?
  • 你可以很容易地通过创建一个方法来调整这个答案,例如IsElementEmpty() 递归遍历所有子元素,直到 1. 用完子元素或 2. 找到一个有值的元素。
  • @user1432798 我已经更新了答案来满足您的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多