C# 如何移除xml文档中的所有命名空间

来源:这里教程网 时间:2026-02-21 17:28:49 作者:

在C#中处理XML时,有时需要移除文档中的所有命名空间,以便简化后续操作。虽然XML本身不支持“无命名空间”的直接转换,但可以通过重新构造元素的方式实现移除命名空间的效果。

使用XDocument移除所有命名空间

你可以通过递归创建新的XML结构,将原始元素复制到新文档中,并清除其命名空间和前缀。以下是一个实用方法:

using System.Xml.Linq;
public static XDocument RemoveAllNamespaces(XDocument doc)
{
    var stripped = new XDocument();
    stripped.Add(RemoveNamespacesInElement(doc.Root));
    return stripped;
}
private static XElement RemoveNamespacesInElement(XElement element)
{
    var cleaned = new XElement(element.Name.LocalName);
    // 复制所有属性(不带命名空间)
    foreach (var attr in element.Attributes().Where(a => !a.IsNamespaceDeclaration))
    {
        cleaned.Add(new XAttribute(attr.Name.LocalName, attr.Value));
    }
    // 复制子节点:文本或嵌套元素
    foreach (var node in element.Nodes())
    {
        if (node is XElement subElement)
        {
            cleaned.Add(RemoveNamespacesInElement(subElement));
        }
        else
        {
            cleaned.Add(node);
        }
    }
    return cleaned;
}

使用示例

假设你有一个包含多个命名空间的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:ns1="http://example.com/ns1" xmlns:ns2="http://example.com/ns2">
  <ns1:item id="1">Value 1</ns1:item>
  <ns2:item id="2">Value 2</ns2:item>
</root>

使用上述方法后,输出结果为:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <item id="1">Value 1</item>
  <item id="2">Value 2</item>
</root>

注意事项

该方法不会修改原始文档,而是生成一个全新的、不含命名空间的XDocument实例。适用于需要统一处理标签名而忽略命名空间的场景,例如数据导入、模板匹配等。

如果原始XML依赖命名空间区分同名元素,则移除后可能导致语义错误,需谨慎使用。

基本上就这些。

相关推荐