C#如何使用SelectNodes和SelectSingleNode方法

SelectNodes和SelectSingleNode是XmlNode类的XPath查询方法,仅适用于XmlDocument体系;需先加载XML、处理命名空间(用XmlNamespaceManager注册前缀),SelectSingleNode返回首个匹配节点(可能为null),SelectNodes返回只读XmlNodeList集合。

C#中使用SelectNodesSelectSingleNode方法,前提是操作XML文档(如XmlDocumentXDocument),但要注意:这两个方法属于XmlNode类(即XmlDocument体系),不适用于LINQ to XML(XDocument)。下面以XmlDocument为例说明用法和关键细节。

确保XML文档已加载并支持XPath

这两个方法依赖XPath表达式进行节点查找,必须先用LoadLoadXml正确加载XML,且文档结构合法。若XML有命名空间,需配合XmlNamespaceManager注册前缀,否则XPath匹配会失败。

  • 直接加载字符串:doc.LoadXml("");
  • 加载文件:doc.Load("data.xml");
  • 未处理命名空间时,//item可能返回空——即使节点存在

SelectSingleNode返回第一个匹配节点

该方法返回XmlNode类型,匹配不到时返回null,适合确定最多一个结果的场景(如找唯一配置项、根下特定子元素)。

  • 基础用法:XmlNode node = doc.SelectSingleNode("/root/item");
  • 带属性筛选:doc.SelectSingleNode("//item[@id='1']");
  • 务必判空再访问属性或子节点,避免NullReferenceException
  • 不支持默认命名空间简写;若XML含xmlns="http://abc",必须声明前缀并使用

SelectNodes返回节点集合

返回XmlNodeList(只读集合),可用foreach或索引访问。注意它不是IEnumerable,不能直接用LINQ方法,需转成列表再处理。

  • 获取所有同名节点:XmlNodeList list = doc.SelectNodes("//item");
  • 遍历示例:foreach (XmlNode n in list) { Console.WriteLine(n.Attributes["id"]?.Value); }
  • 转换为List便于LINQ:var nodes = list.Cast().ToList();
  • 性能提示:XPath执行是即时的,多次调用相同XPath不会缓存,可提取为变量复用

命名空间处理是常见坑点

当XML包含默认命名空间(如),直接写/root查不到节点。必须用XmlNamespaceManager绑定前缀,并在XPath中使用该前缀。

  • 注册命名空间:var nsMgr = new XmlNamespaceManager(doc.NameTable); nsMgr.AddNamespace("ns", "http://myns");
  • 带前缀查询:doc.SelectSingleNode("/ns:root/ns:item", nsMgr);
  • 忽略命名空间的写法(不推荐):"*[local-name()='item']",但可读性和性能较差