跳转到主内容
极星编程网:以代码为星,赴技术山海!

C#如何使用SelectNodes和SelectSingleNode方法

SelectNodes和SelectSingleNode是XmlNode类的XPath查询方法,仅适用于XmlDocument体系;需先加载XML、处理命名空间(用XmlNamespaceManager注册前缀),SelectSingleNode返回首个匹配节点(可能为null),SelectNodes返回只读XmlNodeList集合。 C#中使用
SelectNodes
和
SelectSingleNode
方法,前提是操作XML文档(如
XmlDocument
或
XDocument
),但要注意:这两个方法属于
XmlNode
类(即
XmlDocument
体系), 不适用于LINQ to XML(XDocument) 。下面以
XmlDocument
为例说明用法和关键细节。 确保XML文档已加载并支持XPath 这两个方法依赖XPath表达式进行节点查找,必须先用
Load
或
LoadXml
正确加载XML,且文档结构合法。若XML有命名空间,需配合
XmlNamespaceManager
注册前缀,否则XPath匹配会失败。 直接加载字符串:
doc.LoadXml("");
加载文件:
doc.Load("data.xml");
未处理命名空间时,
//item
可能返回空——即使节点存在 SelectSingleNode返回第一个匹配节点 该方法返回
XmlNode
类型,匹配不到时返回
null
,适合确定最多一个结果的场景(如找唯一配置项、根下特定子元素)。 C知道 CSDN推出的一款AI技术问答工具 下载 基础用法:
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']"
,但可读性和性能较差

相关文章