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

如何使用C#编程获取XML文件中指定标签所属的命名空间?

问题原因

你遇到的xmlns="http://schemas.openxmlformats.org/package/2006/relationships"无法获取对应键的问题,本质是这是默认命名空间,没有绑定显式前缀,常规的GetXmlNamespaces方法默认会跳过无前缀的命名空间条目。

下面提供两种不需要硬编码命名空间,仅需传入XML文件路径和标签名即可实现节点查询、命名空间获取、节点删除的方案:


方案1:推荐使用LINQ to XML实现(.NET Framework 3.5+、.NET Core全版本支持)

该方案不需要手动处理命名空间管理器,直接通过匹配标签本地名定位节点,同时可以直接获取节点所属的命名空间:

using System.Xml.Linq;

// 入参:xml文件路径、目标标签名
public static List<XElement> GetTargetElements(string xmlPath, string tagName)
{
    XDocument doc = XDocument.Load(xmlPath);
    // 匹配所有标签名与入参一致的节点,忽略命名空间
    var targetElements = doc.Descendants()
                            .Where(node => node.Name.LocalName == tagName)
                            .ToList();
    
    // 如需获取该标签所属的命名空间,直接读取元素的Name.Namespace属性即可
    if (targetElements.Any())
    {
        string namespaceValue = targetElements.First().Name.Namespace.NamespaceName;
        Console.WriteLine($"标签{tagName}的所属命名空间为:{namespaceValue}");
    }

    return targetElements;
}

要删除节点直接调用Remove()方法即可:

var nodesToRemove = GetTargetElements("你的XML文件路径.xml", "fileVersion");
nodesToRemove.Remove();
// 保存修改后的XML
doc.Save("你的XML文件路径.xml");

方案2:兼容旧XmlDocument接口的实现

如果你必须使用XmlDocument和SelectNodes方法,可以通过自动构建命名空间管理器+XPath的local-name()函数实现需求:

using System.Xml;

// 自动为XmlDocument构建包含所有命名空间(含默认命名空间)的管理器
private static XmlNamespaceManager BuildNamespaceManager(XmlDocument doc)
{
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
    // 遍历文档中所有命名空间声明
    foreach (XmlAttribute attr in doc.SelectNodes("//@*[namespace-uri()='http://www.w3.org/2000/xmlns/']"))
    {
        // 默认命名空间统一绑定前缀为default
        string prefix = attr.LocalName == "xmlns" ? "default" : attr.LocalName;
        nsmgr.AddNamespace(prefix, attr.Value);
    }
    return nsmgr;
}

// 入参:xml文件路径、目标标签名
public static XmlNodeList GetTargetNodes(string xmlPath, string tagName)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(xmlPath);
    var nsmgr = BuildNamespaceManager(doc);
    // 用local-name()忽略命名空间匹配标签
    return doc.SelectNodes($"//*[local-name()='{tagName}']", nsmgr);
}

删除节点示例:

var nodesToRemove = GetTargetNodes("你的XML文件路径.xml", "fileVersion");
foreach (XmlNode node in nodesToRemove)
{
    // 如需按命名空间过滤可在此处判断node.NamespaceURI属性
    node.ParentNode.RemoveChild(node);
}
// 保存修改
doc.Save("你的XML文件路径.xml");

内容的提问来源于stack exchange,提问作者Yashoda Chandrasekara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 22:15:02