使用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
相关产品推荐
相关产品推荐

