XmlNamespaceManager 是为 XPath 查询提供命名空间映射的关键工具,需注册前缀与 URI(如 AddNamespace("ns", "http://example.com/ns"))才能正确选择带命名空间的节点;默认命名空间须自定义前缀,不可用空字符串或 xmlns。
C# 处理带命名空间的 XML 时,XmlNamespaceManager 是关键工具——它不是用来“解析”XML 的,而是为 XmlDocument 或 XmlXPathNavigator 提供命名空间上下文,让 XPath 查询、节点选择能正确识别带前缀的元素。
XML 命名空间(如 xmlns)让同名元素可区分,但 XPath 默认不认前缀。直接写
:ns="http://example.com/ns"//ns:book 会报错:“前缀‘ns’未声明”。XmlNamespaceManager 就是专门来‘注册’这个映射关系的,告诉 XPath:“ns 这个前缀,对应的是 http://example.com/ns 这个 URI”。
以加载如下 XML 为例:
在 C# 中查询 ns:title 的内容:
XmlDocument 并加载 XMLXmlNamespaceManager,传入文档的 NameTable
AddNamespace("ns", "http://example.com/ns") 注册前缀与 URI 映射SelectSingleNode 或 SelectNodes 的 XPath 中使用该前缀代码示例:
var doc = new XmlDocument();如果 XML 是 (没写前缀),这叫“默认命名空间”,它**不会被任何空前缀匹配**。XPath 中 //title 仍找不到 。
解决方法:给它起个前缀(比如 def),再注册:
nsmgr.AddNamespace("def", "http://example.com/ns");//def:title
注意:不能用 AddNamespace("", uri) —— 空字符串前缀无效,也别用 xmlns 当前缀(那是保留字)。
SelectSingleNode 前都确保传入同一个 XmlNamespaceManager 实例(不要每次 new)AddNamespace 注册,XPath 中可混用(如 //ns:book/def:author)XPathDocument + XPathNavigator 时用法相同,同样需要 XmlNamespaceManager
基本上就这些。不复杂,但容易忽略——没注册,XPath 就永远找不到带前缀的节点。