Wie verwendet man die XPath – Evaluate() Methode
XPath
XPath (XML Path Language) bietet eine flexible Möglichkeit, auf verschiedene Teile eines XML-basierten Dokuments mit einer Nicht-XML-Syntax zu verweisen. Der Name XPath leitet sich vom Pfadausdruck ab, der ein Mittel zur hierarchischen Adressierung der Knoten in einem Dokumentenbaum darstellt. XPath ist eine Abfragesprache mit einer Vielzahl von Möglichkeiten. XPath ermöglicht die Verarbeitung von Werten, die dem DOM-Datenmodell entsprechen; es basiert auf einer DOM-Darstellung des HTML-Dokuments und wählt Knoten nach verschiedenen Kriterien aus. XPath-Ausdrücke können auch in C und C++, JavaScript, XML Schema, PHP, Python und vielen anderen Sprachen verwendet werden.
XPath wird in erster Linie verwendet, um mit Hilfe von XPath-Ausdrücken im DOM eines XML-basierten Sprachdokuments zu navigieren. Sie können XPath in HTML und SVG verwenden, anstatt sich auf die Methoden GetElement() oder QuerySelectorAll() und andere DOM-Funktionen zu verlassen.
Dieser Artikel stellt vor, wie man die Methode Evaluate() verwendet, um durch das HTML-Dokument zu navigieren und Knoten per XPath-Abfrage auszuwählen. Sie lernen, wie Sie mit XPath-Ausdrücken alle Fotos aus einem HTML-Dokument auswählen können.
Sie können die Datendateien und vollständige C#-Beispiele, die die Verwendung der Methode Evaluate() für XPath-Abfragen demonstrieren, von GitHub herunterladen.
Evaluate()-Methode
XPath-Abfragen werden hauptsächlich mit der Methode
Evaluate() der Klasse
Document durchgeführt. Die Methode Evaluate(expression
, contextNode
, resolver
, type
, result
) nimmt einen XPath-Ausdruck und andere angegebene Parameter entgegen und gibt ein Ergebnis des angegebenen Typs zurück. Betrachten wir nun die Parameter der Methode:
expression
ist eine String-Darstellung des auszuwertenden XPath.contextNode
gibt den Kontextknoten für die Auswertung des XPath-Ausdrucks an. Es ist üblich, das Dokument als Kontextknoten zu übergeben.resolver
erlaubt die Übersetzung aller Präfixe, einschließlich des xml-Namespace-Präfixes, innerhalb des XPath-Ausdrucks in entsprechende Namespace-URIs.type
entspricht dem Typ des zurückzugebenden XPathResult-Ergebnisses. Wenn ein bestimmter Typ angegeben wird, wird das Ergebnis als der entsprechende Typ zurückgegeben.result
gibt ein bestimmtes Ergebnisobjekt an, das von dieser Methode wiederverwendet und zurückgegeben werden kann. null ist die gebräuchlichste Angabe und erzeugt ein neues XPathResult.
XPath Query – Abrufen von Bildern aus einer Web-Seite
Oft möchte man eine große Anzahl von Bildern aus verschiedenen Diensten speichern, z. B. Fotos aus einem bestimmten Album. Das kann man zwar von Hand machen, aber es würde sehr viel Zeit in Anspruch nehmen. Es ist also langwierig und ineffizient, daher können Sie die Aspose.HTML-Bibliothek verwenden, um diesen Prozess zu automatisieren.
In diesem Beispiel lernen Sie, wie Sie mit der Methode Evaluate() und dem XPath-Ausdruck Links zu allen gewünschten Bildern auf einer Webseite finden. XPath ist eine mächtige Abfragesprache, die Ihnen viel Freiheit bei der Anpassung von Abfragen bietet. Werfen wir einen Blick auf das HTML-Dokument xpath-image.htm. Es besteht aus einer Kopf- und einer Fußzeile, die Werbebilder enthalten, sowie aus dem Hauptelement, das Reihen von Fotos enthält, die mit Werbebannern durchsetzt sind.
Links zu allen Bildern des Dokuments abrufen
Beginnen wir mit einer einfachen XPath-Abfrage für alle Bilder im Dokument. Die folgende Abfrage verwendet den XPath-Ausdruck //img
. Er wählt alle img
-Elemente aus, unabhängig davon, wo sie sich im Dokument befinden:
XPath Expression
1//img
C# code
1var result = doc.Evaluate("//img", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var result = document.evaluate("//img", document, null, XPathResult.ANY_TYPE, null);
Diese XPath-Abfrage liefert alle Links zu Bildern (Fotos, Banner) in der Kopf- und Fußzeile sowie die Links zwischen den Fotozeilen und unter den Bildern.
Banner in der Kopf- und Fußzeile loswerden
Zunächst wollen wir die Banner in der Kopf- und Fußzeile entfernen. Es gibt viele Möglichkeiten, dies zu tun, aber in diesem Beispiel werden wir die Filterung nach einem übergeordneten Element vornehmen. Die XPath-Abfrage //main//img
gibt alle verschachtelten //img
Elemente innerhalb aller //main
Elemente zurück. Dieses Ergebnis ist bereits besser für die Abfrage geeignet, um Fotos aus dem Dokument zu erhalten, enthält aber immer noch zusätzliche Banner.
XPath Expression
1//main//img
C# code
1var result = doc.Evaluate("//main//img", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var result = document.evaluate("//main//img", document, null, XPathResult.ANY_TYPE, null);
Einige Banner im “main”-Container loswerden
Im nächsten Schritt wollen wir die Banner in den geraden /div
-Kindern des main
-Containers loswerden. Mit diesem XPath-Ausdruck können Sie alle /div
-Kinderelemente auswählen, deren Positionsnummer den Rest ergibt, wenn sie durch 2 geteilt wird, d.h. ungerade ist:
XPath Expression
1//main/div[position() mod 2 = 1]//img
C# code
1var result = doc.Evaluate("//main/div[position() mod 2 = 1]//img", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var result = document.evaluate("//main/div[position() mod 2 = 1]//img", document, null, XPathResult.ANY_TYPE, null);
Wir haben also eine Liste mit Links zu Fotos und Werbebannern, die sich in allen ungeraden div
-Elementen befinden, die Kinder des main
-Containers sind.
Nur Links zu Fotos aus dem HTML-Dokument holen
Um die Werbebanner zwischen den Fotos loszuwerden, muss der XPath-Ausdruck den Namen der Bildklasse enthalten, da alle Fotos in den Zeilen die entsprechende Klasse photo
haben:
XPath Expression
1//main/div[position() mod 2 = 1]//img[@class = 'photo']
C# code
1var result = doc.Evaluate("//main/div[position() mod 2 = 1]//img[@class = 'photo']", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var result = document.evaluate("//main/div[position() mod 2 = 1]//img[@class = 'photo']", document, null, XPathResult.ANY_TYPE, null);
Als Ergebnis erhalten wir eine Liste, die nur Links zu Fotos enthält. Das Einzige, was noch zu tun ist, ist, sie herunterzuladen.
C# Beispiel – Nur Links zu Fotos aus dem HTML-Dokument holen
Betrachten wir das C#-Beispiel, wie man die Evaluate()-Methode verwendet, um alle Fotos aus einem HTML-Dokument mit XPath-Ausdrücken auszuwählen. Sie sollten ein paar Schritte befolgen:
- Laden Sie eine vorhandene HTML-Datei ( xpath-image.htm).
- Verwenden Sie die Methode Evaluate() der Klasse Document und übergeben Sie ihr einen XPath-Ausdruck und andere Parameter.
- Iterieren Sie über die resultierenden Knoten und geben Sie sie auf der Konsole aus.
- Sie erhalten eine Liste, die nur Links zu Fotos aus dem HTML-Dokument enthält.
1// Use XPath to get only links to photos from HTML
2
3// Create an instance of an HTML document
4using (HTMLDocument doc = new HTMLDocument(Path.Combine(DataDir, "xpath-image.htm")))
5{
6 // Evaluate the XPath expression
7 IXPathResult result = doc.Evaluate("//main/div[position() mod 2 = 1]//img[@class = 'photo']", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
8 // Iterate over the resulted nodes and print them to the console
9 Node node;
10 while ((node = result.IterateNext()) != null)
11 {
12 HTMLImageElement img = (HTMLImageElement)node;
13 Console.WriteLine(img.Src);
14 }
15}
Aspose.HTML bietet kostenlose HTML-Webanwendungen, die eine Online-Sammlung von Konvertern, Zusammenführungen, 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.