我有一个很大的XML文档,正在使用C#查询内容。我有类似以下内容:

var bookA = xmlDoc.SelectSingleNode("/books/book[yearPublished=2012 and id=123]");
var bookB = xmlDoc.SelectSingleNode("/books/book[yearPublished=2012 and id=456]");
var bookC = xmlDoc.SelectSingleNode("/books/book[yearPublished=2012 and id=789]");


如您所见,在每个查询中都重复了“ yearPublished”的筛选器,如果我错了,请更正我,整个书籍列表都会被重复解析。拥有以下内容会更有效:

var newBooks = xmlDoc.SelectNodes("/books/book[yearPublished=2012]");
var bookA = newBooks.SelectSingleNode("book[id=123]");
var bookB = newBooks.SelectSingleNode("book[id=456]");
var bookC = newBooks.SelectSingleNode("book[id=789]");


假设我的文档很大(假设它包含约几千本书的数据),我是否纠正基于第一个条件过滤数据,然后从过滤列表中选择所需的XmlNode会更有效?

其次,我试图验证我的假设,但遇到了麻烦。我收到有关SelectSingleNode的错误消息:


'System.Xml.XmlNodeList'不包含以下定义
“ SelectSingleNode”,没有扩展方法“ SelectSingleNode”
接受类型为'System.Xml.XmlNodeList'的第一个参数
找到(您是否缺少using指令或程序集引用?)


我有对System.Xml的引用,也有“使用System.Xml”的引用。我还有其他东西吗?

最佳答案

SelectNodes方法返回XmlNodeList类型。方法SelectSingleNode属于XmlNode类。

您可以像这样获得书籍:

var bookA = newBooks.Where(x => x.Attributes["id"].Value == 123);
var bookB = newBooks.Where(x => x.Attributes["id"].Value == 456);
var bookC = newBooks.Where(x => x.Attributes["id"].Value == 789);

09-13 12:57