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

使用XDocument选择Descendant时如何移除XML命名空间?

移除XDocument中的XML命名空间并选择Body元素

首先先明确你用到的XML结构:

<?xml version="1.0" encoding="UTF-8"?>
<GovTalkMessage xmlns="http://www.govtalk.gov.uk/CM/envelope">
  <EnvelopeVersion>2.0</EnvelopeVersion>
  <Header> </Header>
  <Body>
    <IRenvelope xmlns="http://www.govtalk.gov.uk/taxation/charities/r68/2"> </IRenvelope>
  </Body>
</GovTalkMessage>

针对你的需求,分两种场景来处理:

场景1:只是想选中Body元素,不需要全局移除命名空间

如果你的核心需求只是找到Body元素,没必要修改整个文档的命名空间,直接通过命名空间+元素名的方式查询更高效:

// 定义GovTalkMessage对应的命名空间
XNamespace govTalkNs = "http://www.govtalk.gov.uk/CM/envelope";

// 精准定位Body元素
var xmlBody = XmlDocument.Descendants(govTalkNs + "Body").FirstOrDefault();

这样就能直接获取到目标元素,避免了修改文档结构的开销。

场景2:需要彻底移除整个XML中的所有命名空间

如果你确实要把所有元素的命名空间都去掉,可以遍历文档中所有元素,将它们替换为不带命名空间的同名元素,同时保留属性和子节点:

// 遍历所有层级的元素,移除命名空间(ToList避免遍历中修改结构引发异常)
foreach (var element in XmlDocument.Descendants().ToList())
{
    // 创建新的无命名空间元素,保留原元素的属性(过滤命名空间声明)和子节点
    element.ReplaceWith(new XElement(element.Name.LocalName,
        element.Attributes().Where(attr => !attr.IsNamespaceDeclaration),
        element.Nodes()));
}

// 此时可以直接用本地名称查询Body元素
var xmlBody = XmlDocument.Descendants("Body").FirstOrDefault();

内容的提问来源于stack exchange,提问作者Neil Gilbert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:22:12