在C#中查询带命名空间的XML需手动注册命名空间URI到前缀(如ns),XPath中必须使用该前缀(如//ns:item),默认命名空间也须显式注册,URI须完全一致;XDocument推荐用XNamespace拼接更简洁。

在C#中使用XPath查询带命名空间的XML,关键在于正确注册并引用命名空间前缀,否则即使XPath语法正确也会查不到节点。
必须使用XmlNamespaceManager注册命名空间
XmlDocument或XPathNavigator执行带命名空间的XPath时,不会自动识别XML文档中的xmlns声明。你需要手动创建XmlNamespaceManager,把命名空间URI映射到一个前缀(如ns),然后在XPath中用这个前缀访问元素。
- 命名空间URI必须与XML中
xmlns="..."或xmlns:xxx="..."里的值完全一致(包括末尾斜杠、大小写) - 前缀名可自定义(如
ns、abc),但XPath中必须统一使用该前缀 - 即使默认命名空间(
xmlns="http://example.com")也必须显式注册,不能用空字符串或xml等保留前缀
典型代码示例(XmlDocument + XPathSelectElements)
假设XML如下:
对应C#查询方式:
- 创建
XmlNamespaceManager,传入doc.NameTable - 调用
AddNamespace("ns", "http://tempuri.org")(前缀ns可任取) - XPath写成
"//ns:item/ns:name",不能省略ns: - 用
SelectNodes(xpath, nsmgr)或LINQ to XML的XDocument.XPathSelectElements(xpath, nsmgr)
使用XDocument(推荐,更简洁)
若用XDocument,需配合XNamespace对象,不依赖XmlNamespaceManager:
- 先声明
XNamespace ns = "http://tempuri.org"; - 查询时用
ns + "item"拼接,例如:doc.Root.Elements(ns + "item").Elements(ns + "name") - 也可用XPath:调用
XDocument.XPathSelectElements("//ns:item", new XmlNamespaceManager(new NameTable()) { /* 注册同上 */ }),但不如直接用LINQ直观
常见错误与排查点
查不到结果时优先检查以下几项:
- 命名空间URI是否多写了空格、换行,或协议头大小写不一致(如
HTTP://vshttp://) - XPath中是否遗漏前缀(如写成
//item而不是//ns:item) - 是否对默认命名空间用了
xmlns:ns=""(错误)——应注册为AddNamespace("ns", "实际URI") - XML加载后是否保留了命名空间(避免用
InnerXml拼接导致丢失xmlns)










