You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C# XDocument将空内容元素转为自闭合标签?避免空引用异常

解决XDocument空内容元素转自闭合标签的空引用异常问题

问题原因

你遇到的空引用异常,本质是遍历文档节点时直接修改文档结构导致的:doc.DescendantNodes().OfType<XElement>()返回的是实时节点集合,调用ReplaceWith修改节点时,枚举器会因集合变化失效,触发异常。另外你的代码还存在隐藏问题:用childElement.Name.LocalName创建新元素会丢失原元素的命名空间。

修复后的代码

private static void CleanUpXElements(XDocument doc)
{
    // 先把要处理的元素收集到静态列表,避免遍历实时集合时修改结构引发异常
    var emptyElements = doc.Descendants()
                           .Where(x => !x.HasElements && string.IsNullOrEmpty(x.Value))
                           .ToList();

    foreach (var element in emptyElements)
    {
        // 使用完整元素名称(含命名空间),保留所有属性
        element.ReplaceWith(new XElement(element.Name, element.Attributes()));
    }
}

关键改进点

  • 提前收集元素到列表:ToList()将实时查询转为静态列表,遍历列表时修改文档结构不会影响枚举过程
  • 精准判断空元素:用!x.HasElements && string.IsNullOrEmpty(x.Value)确保元素无任何子节点且内容为空,避免误处理包含子元素的节点
  • 保留命名空间:直接使用element.Name而非LocalName,确保原元素的命名空间信息不丢失

内容的提问来源于stack exchange,提问作者Kieran Ojakangas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:59:57