1

我有一个大型 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”的定义,并且找不到接受“System.Xml.XmlNodeList”类型的第一个参数的扩展方法“SelectSingleNode”(您是否缺少 using 指令或程序集引用?)

我引用了 System.Xml 以及“使用 System.Xml”。我还缺少其他东西吗?

4

3 回答 3

2

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);
于 2012-04-10T22:58:47.367 回答
1
var newBooks = xmlDoc.SelectNodes("/books/book[yearPublished=2012]");

这将返回一个XmlNodeList对象。该对象不包含名为 的方法SelectSingleNode,这就是编译器告诉您的原因。

您可以迭代XmlNodeList从方法返回的节点,SelectNodes如下所示:

foreach (XmlNode node in newBooks)
{
   //...
}

至于您的性能问题或感知的性能问题,我建议您加载所需大小的文件并对其进行基准测试。只有这样,您才能判断是否存在性能问题,因为您将对其进行测量。

于 2012-04-10T23:00:19.603 回答
0

您可以评估具有变量引用的 XPath 表达式——请参阅XPathExpression.SetContext()此示例如何实现 IXsltContextVariable。

于 2012-04-11T02:25:24.813 回答