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 に答える