C#中的SelectNodes和SelectSingleNode用法

13次阅读

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

C#中的SelectNodes和SelectSingleNode用法

SelectNodesSelectSingleNode.netXmlDocument 类提供的两个 XPath 查询方法,用于从 XML 文档中查找节点。它们不返回原始字符串或值,而是返回 XmlNodeListXmlNode 对象,需进一步提取内容(如 InnerTextAttributes 等)。

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)
  • 否则方法返回空结果,且不报错,容易误判为数据缺失
text=ZqhQzanResources