PHP/XML mit Xpath abfragen

Aus Mikiwiki
< PHP
Zur Navigation springen Zur Suche springen

Die Integration der Abfragesprache Xpath ist in PHP5 Bestandteil der Bibliothek "xmllib2" und entsprechend leicht zu verwenden.

Xpath praktisch verwenden

Das folgende Beispiel zeigt die Wirkung der Xpath-Achsenbezeichner. Zum Testen aller erdenklichen Kombinationen wird eine XML-Datei mit entsprechenden Achsen entworfen.

<?xml version="1.0" encoding="iso-8859-1" ?>
<!-- Name     XPathTest.xml -->
<a>
  <b></b>
  <c>
    <d></d>
    <e>
      <h></h>
      <i></i>
    </e>
    <f></f>
    <g></g>
  </c>
  <x></x>
  <y>
    <z></z>
  </y>
</a>

Das folgende Skript wendet darauf alle XPath-Achsenbezeichner an und gibt eine Tabelle mit den Knoten aus.

<?php
function PrintNodeList($nodes)
{
  print "{$nodes->length} Knoten: ";
  foreach ($nodes as $node) 
  { 
    print "&lt;" . strtoupper($node->tagName) . "&gt; "; 
    # echo var_export($node);
  } 
}

$dom = new DomDocument(); 
## Laden des XML-Dokuments.
$dom->load("data/XPathTest.xml"); 
## Aus dem geladenen Dokument wird eine XPath-Instanz erstellt, die
## dann abgefragt werden kann.
$xp  = new DomXPath($dom); 

## Das Array "$expressions" definiert alle Achsennamen, die danach mit
## "foreach" durchlaufen werden, um eine Tabelle mit den Reaktionen zu
## erstellen.
$expressions = array("self",
                     "child",
                     "parent",
                     "descendant",
                     "descendant-or-self",
                     "ancestor",
                     "ancestor-or-self",
                     "preceding",
                     "preceding-sibling",
                     "following",
                     "following-sibling");

echo "<table border=\"1\">\n";
echo "<tr>\n";
echo "<th colspan=\"2\">Element-Beziehungen, ausgehend von \"c\"</th>\n";
echo "</tr>\n";
foreach ($expressions as $expression)
{
  ## Die Abfrage wird auf Grundlage der Elemente vervollständigt. Hier
  ## wird als Ausgangsknoten das Element "<c>" benutzt und der ent-
  ## sprechende Ausdruck angehängt, was dann z. B. folgenden Ausdruck
  ## ergibt:   //c/child::*
  ## In XPath werden damit alle Kinder des Elements "<c>" abgefragt.
  $nodes = $xp->query("//c/$expression::*");
  echo "<tr>\n<td>$expression</td>\n";
  echo "<td>\n";
  PrintNodeList($nodes);
  echo "</td>\n</tr>\n";
}
echo "</table>\n";
?>
Element-Beziehungen, ausgehend von "c"
self 1 Knoten: <C>
child 4 Knoten: <D> <E> <F> <G>
parent 1 Knoten: <A>
descendant 6 Knoten: <D> <E> <H> <I> <F> <G>
descendant-or-self 7 Knoten: <C> <D> <E> <H> <I> <F> <G>
ancestor 1 Knoten: <A>
ancestor-or-self 2 Knoten: <A> <C>
preceding 1 Knoten: <B>
preceding-sibling 1 Knoten: <B>
following 3 Knoten: <X> <Y> <Z>
following-sibling 2 Knoten: <X> <Y>

DOM-Klassen und -Methoden im Zusammenhang mit Xpath

Wenn eine Xpath-Abfrage erfolgreich war, wird eine Liste aus Knoten zurückgegeben, dargestellt durch die Klasse "DOMNodeList". Diese Liste kann nun mit "foreach" verarbeitet oder ein bestimmter Knoten ausgewählt werden. Die folgende Tabelle zeigt die möglichen Methoden und Eigenschaften.

Name Typ Beschreibung
item(index) Methode Gibt das betreffende Element, adressiert durch den Index, als Objekt vom Typ "DomNode" zurück.
length Eigenschaft Gibt die Anzahl der Elemente in der Auflistung zurück.

Der eigentliche Zugriff erfolgt nun über "DomNode", wo folgende Methoden eingesetzt werden können.

Name Beschreibung
insertBefore Fügt vor einem anderen Knoten ein.
replaceChild Ersetzt ein Kindelement.
removeChild Entfernt ein Kindelement.
appendChild Hängt ein Kindelement an.
hasChildNodes Prüft, ob Kindelemente vorhanden sind.
isSameNode Vergleicht zwei Knoten auf Identität.
isDefaultNamespace Prüft, ob der Knoten im Standardnamensraum ist.
isEqualNode Vergleicht zwei Knoten auf Gleichheit.
cloneNode Kopiert (klont) einen Knoten.
isSupported Prüft, ob eine bestimmte Funktion von dieser DOM-Implementierung unterstützt wird.
lookupPrefix Ermittelt das Präfix des Elements (das ist der Alias eines gegebenenfalls genutzten Namensraums).
lookupNamespaceUri Ermittelt den Namensraum des Elements (das ist der vollständige URI).

Neben den Methoden stehen auch eine Reihe von Eigenschaften zur Verfügung, die den Umgang mit XML im Zusammenhang mit Xpath erleichtern.

Name Beschreibung
nodeName
tagName
Name des Elements, das durch den Knoten dargestellt wird.
nodeValue
textContent
Der Inhalt (Text) des Knotens. "textContent" entspricht nicht dem Standard.
nodeType Knotentyp. Hier kann eine der PHP/DOM#Konstanten Konstanten von DOM stehen.
parentNode Der Elternknoten vom Typ "DomNode".
childNodes Auflistung der Kindknoten vom Typ "DomNodeList".
firstChild Der erste Kindknoten vom Typ "DomNode".
lastChild Der letzte Kindknoten vom Typ "DomNode".
nextSibling Der nächste Geschwisterknoten vom Typ "DomNode".
Attributes Auflistung der Attribute.
ownerDocument Das "DomDocument"-Objekt, dem dieser Knoten entstammt.