SelectNodes和SelectSingleNode是XmlNode类的XPath查询方法,仅适用于XmlDocument体系;需先加载XML、处理命名空间(用XmlNamespaceManager注册前缀),SelectSingleNode返回首个匹配节点(可能为null),SelectNodes返回只读XmlNodeList集合。
C#中使用
和
方法,前提是操作XML文档(如
或
),但要注意:这两个方法属于
类(即
体系),
不适用于LINQ to XML(XDocument)
。下面以
为例说明用法和关键细节。
确保XML文档已加载并支持XPath
这两个方法依赖XPath表达式进行节点查找,必须先用
或
正确加载XML,且文档结构合法。若XML有命名空间,需配合
注册前缀,否则XPath匹配会失败。
直接加载字符串:
加载文件:
未处理命名空间时,
可能返回空——即使节点存在
SelectSingleNode返回第一个匹配节点
该方法返回
类型,匹配不到时返回
,适合确定最多一个结果的场景(如找唯一配置项、根下特定子元素)。
C知道
CSDN推出的一款AI技术问答工具
下载
基础用法:
带属性筛选:
务必判空再访问属性或子节点,避免
不支持默认命名空间简写;若XML含
,必须声明前缀并使用
SelectNodes返回节点集合
返回
(只读集合),可用
或索引访问。注意它不是
,不能直接用LINQ方法,需转成列表再处理。
获取所有同名节点:
遍历示例:
转换为List便于LINQ:
性能提示:XPath执行是即时的,多次调用相同XPath不会缓存,可提取为变量复用
命名空间处理是常见坑点
当XML包含默认命名空间(如
),直接写
查不到节点。必须用
绑定前缀,并在XPath中使用该前缀。
注册命名空间:
带前缀查询:
忽略命名空间的写法(不推荐):
,但可读性和性能较差
SelectNodesSelectSingleNodeXmlDocumentXDocumentXmlNodeXmlDocumentXmlDocumentLoadLoadXmlXmlNamespaceManagerdoc.LoadXml(" ");doc.Load("data.xml");//itemXmlNodenullXmlNode node = doc.SelectSingleNode("/root/item");doc.SelectSingleNode("//item[@id='1']");NullReferenceExceptionxmlns="http://abc"XmlNodeListforeachIEnumerableXmlNodeList list = doc.SelectNodes("//item");foreach (XmlNode n in list) { Console.WriteLine(n.Attributes["id"]?.Value); }var nodes = list.Cast().ToList(); /rootXmlNamespaceManagervar nsMgr = new XmlNamespaceManager(doc.NameTable); nsMgr.AddNamespace("ns", "http://myns");doc.SelectSingleNode("/ns:root/ns:item", nsMgr);"*[local-name()='item']"