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

