Filterung XmlNodeList mit weiteren XPath-Abfrage?
Ich habe eine große XML-Dokument, und ich bin mit C# für die Abfrage der Inhalte. Ich habe etwas ähnliches wie die folgenden:
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]");
Wie Sie sehen können, wird der filter auf "yearPublished", wiederholt sich in jeder Abfrage und, bitte korrigiert mich wenn ich falsch bin, wird die gesamte Liste der Bücher, die analysiert wird, wiederholt. Wäre es effizienter sein, um so etwas wie die folgenden:
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]");
Vorausgesetzt, mein Dokument ist groß (sagen wir, es enthält die Daten über mehrere tausend Bücher), bin ich richtig, dass es effizienter wäre, die Daten zu filtern, basierend auf dem ersten Kriterien und wählen Sie dann die gewünschte XmlNode aus der gefilterten Liste?
Zweitens, ich war versuchen zu bestätigen meine Annahme, aber ich bin Probleme. Ich bekomme eine Fehlermeldung über SelectSingleNode:
'- System.Xml.XmlNodeList' enthält keine definition für
'SelectSingleNode" und keine Erweiterung Methode SelectSingleNode'
die Annahme ein erstes argument vom Typ 'System.Xml.XmlNodeList' werden könnte
gefunden (fehlt eine using-Direktive oder ein Assemblyverweis?)
Habe ich einen Verweis auf System.Xml und auch "verwenden System.Xml". Übersehe ich etwas anderes?
- Das XML ist schon "analysiert", wenn
xmlDoc
verwendet wird. Nur die XPath-Abfrage zu [re]ausgewertet. Ja, mehrere Male, bedeutet "mehr Arbeit", aber es bedeutet nicht "praktisch" langsamer und es könnte genau so schnell-oder schneller! -- als Iteration, da der ID-Klausel. Der einzige Weg zu wissen, der sicher ist, dass der benchmark. - Ich persönlich bevorzuge XDocument - /XElement und Freunde, wie es unterstützt XPath über Erweiterung Methoden. Ist es schneller? Ich weiß nicht, oder Pflege, wie ich die Oberfläche besser, es sieht sauberer aus, zu mir, und ich habe keine solche performance-überlegungen 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den SelectNodes Methode gibt ein XmlNodeList geben. Die Methode SelectSingleNode gehört zu den XmlNode Klasse.
Können Sie sich Ihre Bücher wie dieses:
ID
im DOM.Diese zurück XmlNodeList Objekt. Dieses Objekt enthält nicht eine Methode namens
SelectSingleNode
, das ist der Grund, warum der compiler sagt Ihnen, dass.Können Sie iterieren über die Knoten in der
XmlNodeList
zurückgegeben, die von derSelectNodes
Methode etwa so:Als für Ihre performance-Problem, oder vermeintliche performance-Problem, ich schlage vor, Sie laden eine Datei der von Ihnen gewünschten Größe und Teste es. Nur dann können Sie sagen, wenn Sie ein performance-problem, wie haben Sie es nachgemessen.
Können Sie auswerten, ein XPath-Ausdruck mit variable referenziert ist -- siehe XPathExpression.SetContext() und dieses Beispiel implementieren Sie eine IXsltContextVariable.