Start · Sprachen · PHP · Referenz · DOMXPath

DOMXPath

Klasse

Ermöglicht die Ausführung von XPath-Abfragen auf einem <code>DOMDocument</code>, um Knoten gezielt zu suchen und auszuwählen.

seit PHP 5.0.0 Kategorie: xml

Signatur

class DOMXPath

Beschreibung

DOMXPath ist die PHP-Implementierung des W3C-XPath-Standards und erlaubt es, mit Hilfe von XPath-Ausdrücken gezielt Knoten oder Knotenlisten in einem XML- oder HTML-DOM-Baum zu selektieren. Die Klasse wird immer in Verbindung mit einem DOMDocument-Objekt verwendet, das bei der Instanziierung übergeben wird.

Typische Anwendungsfälle sind das Extrahieren bestimmter Elemente aus komplexen XML-Dokumenten, das Auslesen von Attributwerten oder Texinhalten sowie das Auswerten von booleschen oder numerischen XPath-Ausdrücken. XPath ist dabei deutlich mächtiger als eine manuelle Traversierung über childNodes oder getElementById, weil beliebige Achsen, Prädikate und Funktionen genutzt werden können.

Namespaces müssen mit registerNamespace() explizit registriert werden, bevor sie in Abfragen verwendet werden dürfen. Eigene PHP-Funktionen lassen sich über registerPhpFunctions() in XPath-Ausdrücken nutzbar machen, was mächtige, aber auch sicherheitskritische Szenarien ermöglicht.

Abfragen werden entweder mit query() (gibt eine DOMNodeList zurück) oder mit evaluate() (kann auch skalare Typen zurückgeben) ausgeführt.

Parameter

Name Typ Default Beschreibung
$document Pflicht DOMDocument Das DOMDocument-Objekt, auf dem XPath-Abfragen ausgeführt werden sollen.
$registerNodeNS bool true Wenn true, wird der Standard-Namespace des Dokuments automatisch registriert. Ab PHP 8.0 verfügbar.

Beispiele

Einfache XPath-Abfrage auf ein XML-Dokument

<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<bibliothek>
  <buch id="1">
    <titel>PHP Handbuch</titel>
    <autor>Max Mustermann</autor>
  </buch>
  <buch id="2">
    <titel>XML für Profis</titel>
    <autor>Erika Musterfrau</autor>
  </buch>
</bibliothek>
XML;

$dom = new DOMDocument();
$dom->loadXML($xml);

$xpath = new DOMXPath($dom);

// Alle Buchtitel auslesen
$titel = $xpath->query('//buch/titel');
foreach ($titel as $node) {
    echo $node->textContent . PHP_EOL;
}
PHP Handbuch XML für Profis

XPath mit Prädikat und evaluate() für skalare Auswertung

<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<produkte>
  <produkt kategorie="software">
    <name>PHP Storm</name>
    <preis>199.00</preis>
  </produkt>
  <produkt kategorie="hardware">
    <name>Tastatur</name>
    <preis>49.99</preis>
  </produkt>
  <produkt kategorie="software">
    <name>VS Code</name>
    <preis>0.00</preis>
  </produkt>
</produkte>
XML;

$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);

// Anzahl der Software-Produkte ermitteln
$anzahl = $xpath->evaluate('count(//produkt[@kategorie="software"])');
echo "Software-Produkte: " . $anzahl . PHP_EOL;

// Nur Software-Produkte per Knoten auslesen
$softwareProdukte = $xpath->query('//produkt[@kategorie="software"]/name');
foreach ($softwareProdukte as $node) {
    echo '- ' . $node->textContent . PHP_EOL;
}
Software-Produkte: 2 - PHP Storm - VS Code

Namespace-Registrierung bei XML mit Namespaces

<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:dc="http://purl.org/dc/elements/1.1/">
  <dc:title>Dublin Core Titel</dc:title>
  <dc:creator>Max Mustermann</dc:creator>
</root>
XML;

$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);

// Namespace registrieren
$xpath->registerNamespace('dc', 'http://purl.org/dc/elements/1.1/');

$ergebnis = $xpath->query('//dc:title');
foreach ($ergebnis as $node) {
    echo $node->textContent . PHP_EOL;
}
Dublin Core Titel

// Wichtig · Fallstricke

Sicherheitshinweis zu registerPhpFunctions(): Wenn eigene PHP-Funktionen in XPath-Ausdrücken registriert werden, die aus Benutzereingaben stammen, kann dies zur Ausführung beliebiger PHP-Funktionen führen. Es sollten daher nur explizit erlaubte Funktionsnamen als Array übergeben werden, z. B. $xpath->registerPhpFunctions(['strtotime', 'strtolower']), statt pauschal alle PHP-Funktionen freizugeben.

Fehlerbehandlung: query() gibt false zurück, wenn der XPath-Ausdruck ungültig ist. Im Standardmodus erzeugt PHP dabei einen Fehler der Stufe E_WARNING. Es empfiehlt sich, den internen libxml-Fehlermodus mit libxml_use_internal_errors(true) zu aktivieren, um Fehler kontrolliert abzufangen.

Kontextknoten: Sowohl query() als auch evaluate() akzeptieren als zweiten Parameter einen optionalen Kontextknoten (DOMNode), der den Ausgangspunkt der Suche einschränkt — nützlich, wenn Abfragen relativ zu einem bestimmten Element ausgeführt werden sollen.