Selectnodes 返回 xmlNodeList(含零个或多个节点),SelectSingleNode 返回首个匹配 XmlNode 或 NULL;二者均需处理空值与命名空间。

SelectNodes 和 SelectSingleNode 是 .net 中 XmlDocument 类提供的两个 XPath 查询方法,用于从 XML 文档中查找节点。它们不返回原始字符串或值,而是返回 XmlNodeList 或 XmlNode 对象,需进一步提取内容(如 InnerText、Attributes 等)。
SelectNodes:获取匹配的所有节点
返回一个 XmlNodeList,包含所有符合 XPath 表达式的节点。即使只匹配一个或零个节点,也始终返回列表(空列表或含多个项)。
- 适用于需要遍历多个同名元素的场景,比如读取所有
或所有 - 调用后应检查
count属性,避免对空列表做索引访问引发异常 - 常见写法:
var nodes = doc.SelectNodes("//book/title");—— 查找所有元素(无论嵌套多深)
SelectSingleNode:只取第一个匹配节点
返回第一个匹配的 XmlNode,若无匹配则返回 null。适合确定唯一存在的节点(如根下的 或某个 ID 唯一的元素)。
- 必须判空再访问属性或子节点,否则可能触发
NullReferenceException - 注意它不保证“最深”或“最近”,而是按文档顺序返回首个匹配项
- 示例:
var node = doc.SelectSingleNode("/root/user[@id='123']/name");—— 查找 id=123 的 user 下的 name
XPath 表达式要点
两个方法都依赖 XPath 语法,常见用法包括:
-
/root/child:从根开始的绝对路径 -
//item:任意位置的(深度无关) -
./price:当前节点下的直接子节点 -
[@attr='value']:带属性筛选,如user[@active='true'] -
[1]:索引(XPath 从 1 开始),如//book[1]取第一个 book
命名空间处理(常被忽略)
如果 XML 含命名空间(如 xmlns="http://example.com/ns"),直接写 //book 会查不到节点。必须注册命名空间前缀并使用:
- 创建
XmlNamespaceManager,添加前缀映射:mgr.AddNamespace("x", "http://example.com/ns"); - 查询时带上前缀:
doc.SelectNodes("//x:book", mgr) - 否则方法返回空结果,且不报错,容易误判为数据缺失