SelectNodes和SelectSingleNode是XmlNode类的XPath查询方法,仅适用于XmlDocument体系;需先加载XML、处理命名空间(用XmlNamespaceManager注册前缀),SelectSingleNode返回首个匹配节点(可能为null),SelectNodes返回只读XmlNodeList集合。
C#中使用SelectNodes和SelectSingleNode方法,前提是操作XML文档(如XmlDocument或XDocument),但要注意:这两个方法属于XmlNode类(即XmlDocument体系),不适用于LINQ to XML(XDocument)。下面以XmlDocument为例说明用法和关键细节。
这两个方法依赖XPath表达式进行节点查找,必须先用Load或LoadXml正确加载XML,且文档结构合法。若XML有命名空间,需配合XmlNamespaceManager注册前缀,否则XPath匹配会失败。
doc.LoadXml(" ");
doc.Load("data.xml");
//item可能返回空——即使节点存在该方法返回XmlNode类型,匹配不到时返回null,适合确定最多一个结果的场景(如找唯一配置项、根下特定子元素)。
XmlNode
node = doc.SelectSingleNode("/root/item");
doc.SelectSingleNode("//item[@id='1']");
NullReferenceException
xmlns="http://abc",必须声明前缀并使用返回XmlNodeList(只读集合),可用foreach或索引访问。注意它不是IEnumerable,不能直接用LINQ方法,需转成列表再处理。
XmlNodeList list = doc.SelectNodes("//item");
foreach (XmlNode n in list) { Console.WriteLine(n.Attributes["id"]?.Value); }
var nodes = list.Cast().ToList();
当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']",但可读性和性能较差