在C#中用XPath选择带命名空间前缀的节点,必须注册XmlNamespaceManager并精确匹配URI——直接写prefix:node会报错或返回空;需用AddNamespace注册前缀与URI映射,并将manager传入SelectNodes/SelectSingleNode。

在C#中用XPath选择带命名空间前缀的节点,关键不是直接写prefix:node,而是必须注册命名空间并使用XmlNamespaceManager——否则XPath会报错或查不到节点。
注册命名空间管理器
XML文档若有类似这种带前缀的结构,XPath引擎默认不认识ns:。你需要显式告诉它这个前缀对应哪个URI:
- 创建
XmlNamespaceManager,传入XmlDocument.NameTable - 用
AddNamespace("ns", "http://example.com/ns")注册前缀与URI映射 - 把这个manager传给
SelectNodes()或SelectSingleNode()
完整代码示例
假设XML是:
对应C#代码:
var doc = new XmlDocument();
doc.LoadXml(xmlString);
var nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("ns", "http://example.com/ns");
// ✅ 正确:用注册的前缀
var items = doc.SelectNodes("//ns:item", nsmgr);
// ❌ 错误:不注册直接写 ns:item → 报错或返回空
// var items = doc.SelectNodes("//ns:item");
注意命名空间URI必须完全一致
前缀名(如ns)可以自定义,但URI字符串必须和XML中声明的**一字不差**,包括大小写、末尾斜杠、协议等。比如XML里是xmlns:abc="https://test.org/v1/",代码里就得写nsmgr.AddNamespace("abc", "https://test.org/v1/"),少个/都匹配不上。
处理默认命名空间(无前缀)
如果XML用了默认命名空间:,那所有元素其实都属于该命名空间,但没前缀。此时仍需注册一个前缀(比如def),然后在XPath中用它:
nsmgr.AddNamespace("def", "http://default.com")- XPath写成
//def:item,不能写//item
本质上,XPath不支持“无前缀即默认”的语法,必须显式绑定。
基本上就这些。核心就一条:有命名空间,必配XmlNamespaceManager;URI对不上,结果就是空。









