XmlNamespaceManager 是为 XPath 查询提供命名空间映射的关键工具,需注册前缀与 URI(如 AddNamespace("ns", "http://example.com/ns"))才能正确选择带命名空间的节点;默认命名空间须自定义前缀,不可用空字符串或 xmlns。

C# 处理带命名空间的 XML 时,XmlNamespaceManager 是关键工具——它不是用来“解析”XML 的,而是为 XmlDocument 或 XmlXPathNavigator 提供命名空间上下文,让 XPath 查询、节点选择能正确识别带前缀的元素。
为什么必须用 XmlNamespaceManager?
XML 命名空间(如 xmlns:ns="http://example.com/ns")让同名元素可区分,但 XPath 默认不认前缀。直接写 //ns:book 会报错:“前缀‘ns’未声明”。XmlNamespaceManager 就是专门来‘注册’这个映射关系的,告诉 XPath:“ns 这个前缀,对应的是 http://example.com/ns 这个 URI”。
基本用法:三步走
以加载如下 XML 为例:
在 C# 中查询 ns:title 的内容:
- 创建
XmlDocument并加载 XML - 新建
XmlNamespaceManager,传入文档的NameTable - 用
AddNamespace("ns", "http://example.com/ns")注册前缀与 URI 映射 - 在
SelectSingleNode或SelectNodes的 XPath 中使用该前缀
代码示例:
var doc = new XmlDocument();doc.LoadXml(xmlString);
var nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("ns", "http://example.com/ns");
var titleNode = doc.SelectSingleNode("//ns:title", nsmgr);
if (titleNode != null)
Console.WriteLine(titleNode.InnerText); // 输出:C#入门
处理默认命名空间(无前缀的 xmlns)
如果 XML 是 (没写前缀),这叫“默认命名空间”,它**不会被任何空前缀匹配**。XPath 中 //title 仍找不到 。
解决方法:给它起个前缀(比如 def),再注册:
nsmgr.AddNamespace("def", "http://example.com/ns");- XPath 改成
//def:title
注意:不能用 AddNamespace("", uri) —— 空字符串前缀无效,也别用 xmlns 当前缀(那是保留字)。
常见坑和建议
- 每次调用
SelectSingleNode前都确保传入同一个XmlNamespaceManager实例(不要每次 new) - URI 必须完全一致(包括末尾斜杠、大小写),否则匹配失败
- 如果 XML 有多个命名空间,全部用
AddNamespace注册,XPath 中可混用(如//ns:book/def:author) - 用
XPathDocument + XPathNavigator时用法相同,同样需要XmlNamespaceManager
基本上就这些。不复杂,但容易忽略——没注册,XPath 就永远找不到带前缀的节点。










