Wie man mit XPath XML-Knoten auswählt – C#
XPath (XML Path Language) basiert auf einer DOM-Darstellung eines XML-Dokuments. Daher können Sie XPath verwenden, um einen bestimmten Knoten oder bestimmte Knoten in einer XML-Datei zu finden, die einigen im XPath-Ausdruck definierten Kriterien entsprechen. In diesem Artikel werden С# Beispiele für die Auswahl der erforderlichen Informationen aus einer XML-Datei mit Hilfe von XPath-Abfragen behandelt. Sie werden lernen, wie Sie durch ein XML-Dokument navigieren und Knoten mit Hilfe von XPath auswählen können.
Wie man mit der Methode Evaluate() durch ein HTML-Dokument navigiert und Knoten mit Hilfe einer XPath-Abfrage auswählt, erfahren Sie im Artikel Wie man die Methode XPath – Evaluate() verwendet.
Sie können die Datendateien und vollständige C#-Beispiele, die die Verwendung der Evaluate()-Methode für XPath-Abfragen demonstrieren, von GitHub herunterladen.
XPath-Abfrage – Knoten aus XML-Datei auswählen
In diesen Beispielen wird gezeigt, wie man mit der Abfragesprache XPath die gewünschten Informationen aus einer XML-Datei auswählt. Werfen wir einen Blick auf das XML-Dokument cars.xml. Dieses Test-XML-Dokument enthält eine Datenbank mit Autohändlern, ihren Telefonnummern, Namen und einer Liste der Autos, die sie besitzen.
Lassen Sie uns nacheinander XPath-Ausdrücke zusammenstellen, die Namen, Telefonnummern und eine Liste von Autos auswählen, die Sie interessieren. XPath ist sehr leistungsfähig, wie Sie in den folgenden Beispielen sehen werden:
Alle “Dealer”-Knoten in der XML-Datei auswählen
XPath wird programmatisch verwendet, um Ausdrücke auszuwerten und bestimmte Knoten in einem XML-Dokument auszuwählen. Um Knoten aus XML auszuwählen, verwenden Sie die Methode Evaluate().
Beginnen wir mit einer einfachen XPath-Abfrage für alle “Dealer”-Knoten im XML-Dokument. Im Folgenden wird der XPath-Ausdruck //Dealer
verwendet. Er wählt alle “Dealer”-Elemente aus, unabhängig davon, wo sie sich im Dokument befinden:
C#-Code
1var dealers = doc.Evaluate("//Dealer", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript-Code
1var dealers = document.evaluate("//Dealer", document, null, XPathResult.ANY_TYPE, null);
Sie wählen also Informationen über alle Händler aus der XML-Datei aus, ohne irgendwelche Einschränkungen. Mit dem XPath-Ausdruck //Dealer
können Sie alle verschachtelten Knoten mit dem Namen “Dealer” auswählen.
Knoten mit XPath-Achsen auswählen – descendant::
XPath-Abfrage mit Einschränkungen für das Produktionsdatum von Autos
Erschweren wir die XPath-Abfrage und fügen wir eine Einschränkung für das Jahr der Fahrzeugproduktion hinzu.
Sie können XPath-Achsen in XPath-Ausdrücken verwenden. XPath-Achsen stellen eine Beziehung zum aktuellen Knoten dar und werden verwendet, um Knoten relativ zu diesem Knoten in der Dokumentstruktur zu finden. Die “Descendant”-Achse zeigt alle Kinder des Kontextknotens, alle ihre Kinder usw. an. Mit anderen Worten, der Nachkomme wählt alle Nachkommen (Kinder, Enkel, usw.) des aktuellen Knotens aus. Zum Beispiel wählt descendant::Car
alle Car-Nachfahren des aktuellen Knotens aus.
Erstellen wir also einen XPath-Ausdruck, um die Händler zu finden, die ein Auto descendant::Car
mit einem Herstellungsdatum des Modells neuer als 2005 haben descendant::Model > 2005
. In Bezug auf den DOM-Baum suchen wir nach allen “Dealer”-Kindern mit dem Namen “Car”, die ein Kind mit dem Namen “Model” haben, das einen Wert größer als “2005” hat. Im Folgenden wird der XPath-Ausdruck //Dealer[descendant::Car[descendant::Model > 2005]]
verwendet.
C#-Code
1var dealers = doc.Evaluate("//Dealer[descendant::Car[descendant::Model > 2005]]", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript-Code
1var dealers = document.evaluate("//Dealer[descendant::Car[descendant::Model > 2005]]", document, null, XPathResult.ANY_TYPE, null);
XPath-Abfrage mit Beschränkungen für das Produktionsdatum und den Preis eines Autos
Im nächsten Schritt fügen wir mehr Einschränkungen hinzu: Wir führen eine Einschränkung für den Preis des Autos ein und descendant::Price < 25000
.
Der XPath-Ausdruck lautet: //Händler[Nachkomme::Auto[Nachkomme::Modell > 2005 und Nachkomme::Preis < 25000]]
. Anmerkung: Die Bedingungen für Preis und Baujahr werden mit and
kombiniert, was bedeutet, dass beide Bedingungen gleichzeitig ausgeführt werden:
C#-Code
1var dealers = doc.Evaluate("//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript-Code
1var dealers = document.evaluate("//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]", document, null, XPathResult.ANY_TYPE, null);
Als Ergebnis werden nur Händler ausgewählt, die ein Auto mit einem Herstellungsdatum nicht älter als 2005 und einem Preis von weniger als 25.000 haben.
C# Beispiel, Teil 1 – Knoten aus XML-Datei auswählen
Betrachten wir, wie man Händler aus einer XML-Datei auswählt, die ein Auto mit einem Herstellungsdatum nicht älter als 2005 und einem Preis von weniger als 25.000 haben, und die erforderlichen Informationen auf der Konsole ausgibt. Sie sollten einige Schritte befolgen:
- Laden Sie eine vorhandene XML-Datei ( cars.xml).
- Verwenden Sie die Methode
Evaluate() der Klasse
Document und übergeben Sie ihr den XPath-Ausdruck
//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]
und andere Parameter. - Iterieren Sie über die resultierenden Knoten und geben Sie deren Inhalt auf der Konsole aus.
- Sie erhalten eine Liste von Händlern mit dem gesamten Inhalt der “Dealer”-Knoten.
1// Use XPath to select nodes from XML
2
3// Create an instance of a document
4using (HTMLDocument doc = new HTMLDocument(Path.Combine(DataDir, "cars.xml")))
5{
6 // Select dealers that match XPath expression
7 IXPathResult dealers = doc.Evaluate("//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
8 Node dealer;
9
10 // Iterate over the selected dealers
11 while ((dealer = dealers.IterateNext()) != null)
12 {
13 Console.WriteLine(dealer.TextContent);
14 }
15}
C# Beispiel, Teil 2 – Spezifische Informationen aus ausgewählten Knoten auswählen
Im vorherigen Teil des Beispiels wählt die XPath-Abfrage alle Inhalte des Knotens “Dealer” aus, die dem XPath-Ausdruck //Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]
entsprechen. Sie können jedoch aus dem gesamten Inhalt des ausgewählten Knotens “Dealer” nur die Informationen auswählen und ausdrucken, an denen Sie interessiert sind.
In diesem Beispiel (
cars.xml) wurde eine interne Abfrage innerhalb der Schleife zu den ausgewählten “Dealer”-Knoten hinzugefügt. Die Abfrage sammelt als String die Informationen über den Händler wie “Name” und “Telefon”: concat('Dealer name: ', Name, 'Telephone: ', Telephone)
. Achten Sie auf den zweiten Parameter, der an die Methode
Evaluate(expression
, contextNode
, resolver
, type
, result
) übergeben wird. Dies ist der Knoten, relativ zu dem die Abfrage ausgeführt wird – der aktuelle “Dealer”-Knoten. Diese Abfrage verkettet den Inhalt von Knoten mit den Namen “Name” und “Telefon”. Hinweis: Die Abfrage verwendet den erwarteten Ergebnistyp der Zeichenkette XPathResultType.String
, und der Ergebniswert wird über die Eigenschaft StringValue
und nicht über den Knoten-Iterator ermittelt.
Zur Liste der ausgewählten Händler kann das Attribut “CarID” hinzugefügt werden, das auf ein bestimmtes Fahrzeug verweist. Eine Abfrage sollte mit dem XPath-Ausdruck .//Car[descendant::Model > 2005 and descendant::Price < 25000]/@CarID
erfolgen. Die hinzugefügte Abfrage weist mehrere Merkmale auf; sehen wir sie uns an:
- Die Abfrage wählt alle verschachtelten Autos relativ zum aktuellen Knoten
.//Car
aus, nicht relativ zur Baumwurzel//Car
; - im XPath-Ausdruck wird das Attribut
/@CarID
abgefragt, an dem wir für die ausgewählten Autos interessiert sind.
1// Query and extract XML data using XPath expressions
2
3// Create an instance of a document
4using (HTMLDocument doc = new HTMLDocument(Path.Combine(DataDir, "cars.xml")))
5{
6 // Select dealers that match XPath expression
7 IXPathResult dealers = doc.Evaluate("//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
8 Node dealer;
9
10 // Iterate over the selected dealers
11 while ((dealer = dealers.IterateNext()) != null)
12 {
13 // Get and print Dealer name and Telephone
14 IXPathResult dealerInfo = doc.Evaluate("concat('Dealer name: ', Name/text(), ' Telephone: ', Telephone/text())", dealer, doc.CreateNSResolver(doc), XPathResultType.String, null);
15 Console.WriteLine(dealerInfo.StringValue);
16
17 // Select and print CarID that match XPath expression
18 IXPathResult carIds = doc.Evaluate(".//Car[descendant::Model > 2005 and descendant::Price < 25000]/@CarID", dealer, doc.CreateNSResolver(doc), XPathResultType.Any, null);
19 Node carId;
20
21 while ((carId = carIds.IterateNext()) != null)
22 {
23 Console.WriteLine("Car id: " + carId.TextContent);
24 }
25 }
26}
Als Ergebnis erhalten wir eine Liste von Händlern mit Namen, Telefonen und ID-Codes der Autos, die uns interessieren.
Aspose.HTML bietet kostenlose HTML-Webanwendungen, die eine Online-Sammlung von Konvertern, Zusammenschlüssen, SEO-Tools, HTML-Code-Generatoren, URL-Tools und mehr sind. Die Anwendungen funktionieren auf jedem Betriebssystem mit einem Webbrowser und erfordern keine zusätzliche Softwareinstallation. Es ist eine schnelle und einfache Möglichkeit, Ihre HTML-bezogenen Aufgaben effizient und effektiv zu lösen.