Signatur
Beschreibung
Dom\XPath ist Teil der modernen, HTML5-fähigen DOM-Erweiterung (Namespace Dom\), die ab PHP 8.4 verfügbar ist. Sie erlaubt es, XPath-1.0-Ausdrücke auf einem zuvor geladenen Dom\Document-Objekt auszuwerten und so beliebige Knoten, Attribute oder Textwerte gezielt zu selektieren – ohne manuelles Traversieren des Baums.
Die Klasse entspricht in ihrer Konzeption weitgehend der älteren DOMXPath-Klasse, ist jedoch vollständig in den neuen Dom\-Namensraum integriert und arbeitet mit den ebenfalls neuen Klassen wie Dom\NodeList, Dom\Element usw. zusammen. Namespaces lassen sich über registerNamespace() anmelden, bevor Ausdrücke evaluiert werden.
Mit der Methode query() lassen sich alle übereinstimmenden Knoten als Dom\NodeList abrufen. evaluate() wertet einen XPath-Ausdruck aus und gibt – je nach Ergebnis – Skalare (String, Boolean, Zahl) oder eine Dom\NodeList zurück. Beide Methoden akzeptieren optional einen Kontextknoten, von dem aus der Ausdruck relativ ausgewertet wird.
Der Einsatz ist besonders nützlich beim Parsen und Durchsuchen von HTML- oder XML-Dokumenten, z. B. beim Screen-Scraping, bei der Datenextraktion aus RSS-Feeds oder beim Testen von DOM-Strukturen in Integrationstests.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $document Pflicht | Dom\Document | Das Dom\Document-Objekt, auf dem XPath-Ausdrücke ausgewertet werden sollen. |
|
| $registerNodeNamespaces | bool | false | Wenn true, werden Namespaces aus dem Dokument automatisch registriert, sodass sie in XPath-Ausdrücken verwendet werden können. |
Beispiele
Alle Links aus einem HTML-Dokument per XPath selektieren
<?php
$html = <<<HTML
<!DOCTYPE html>
<html>
<body>
<a href="https://php.net">PHP</a>
<a href="https://example.com">Beispiel</a>
</body>
</html>
HTML;
$doc = Dom\HTMLDocument::createFromString($html);
$xpath = new Dom\XPath($doc);
$links = $xpath->query('//a[@href]');
foreach ($links as $link) {
echo $link->getAttribute('href') . ' => ' . $link->textContent . PHP_EOL;
}
XPath evaluate() zur Zählung von Elementen verwenden
<?php
$xml = <<<XML
<?xml version="1.0"?>
<katalog>
<buch><titel>PHP 8</titel></buch>
<buch><titel>Clean Code</titel></buch>
<buch><titel>Domain-Driven Design</titel></buch>
</katalog>
XML;
$doc = Dom\XMLDocument::createFromString($xml);
$xpath = new Dom\XPath($doc);
$anzahl = $xpath->evaluate('count(//buch)');
echo 'Anzahl Bücher: ' . $anzahl . PHP_EOL;
$ersterTitel = $xpath->evaluate('string(//buch[1]/titel)');
echo 'Erstes Buch: ' . $ersterTitel . PHP_EOL;
Namespace-Präfix registrieren und in XPath verwenden
<?php
$xml = <<<XML
<?xml version="1.0"?>
<feed xmlns:atom="http://www.w3.org/2005/Atom">
<atom:entry><atom:title>Eintrag 1</atom:title></atom:entry>
<atom:entry><atom:title>Eintrag 2</atom:title></atom:entry>
</feed>
XML;
$doc = Dom\XMLDocument::createFromString($xml);
$xpath = new Dom\XPath($doc);
$xpath->registerNamespace('a', 'http://www.w3.org/2005/Atom');
$titel = $xpath->query('//a:entry/a:title');
foreach ($titel as $t) {
echo $t->textContent . PHP_EOL;
}
// Wichtig · Fallstricke
Nur für Dom\-Dokumente: Dom\XPath funktioniert ausschließlich mit Objekten aus dem Dom\-Namensraum (z. B. Dom\HTMLDocument, Dom\XMLDocument). Für ältere DOMDocument-Objekte muss weiterhin DOMXPath verwendet werden.
Sicherheit: Wenn XPath-Ausdrücke aus Benutzereingaben zusammengebaut werden, besteht die Gefahr einer XPath-Injection. Benutzereingaben sollten niemals ungeprüft in XPath-Strings eingefügt werden. Verwende stattdessen parametrisierte Ausdrücke oder escape Eingaben manuell (z. B. durch Umrahmung mit Anführungszeichen und Prüfung auf unerwünschte Zeichen).
Verfügbarkeit: Die Klasse Dom\XPath ist erst ab PHP 8.4.0 verfügbar. Für ältere PHP-Versionen muss DOMXPath aus der klassischen DOM-Erweiterung genutzt werden.