Jetzt möchte ich wissen, ob der Knoten e1 ein Unterelement e2 besitzt.
Ich habe keine Ahnung, wie sich das mit SimpleXML lösen lässt. Wahrscheinlich aus dem Grund, weil es keine Möglichkeit gibt.
Es gibt strenggenommen durchaus Möglichkeiten, zu überprüfen, ob ein solches Element existiert.
In SimpleXML wird davon ausgegangen, dass es im Markup einfache Zuordnungen zwischen Elementen und deren Textinhalt gibt. Daher ist ein Beispiel mit dem leeren Element sowieso keines, wofür SimpleXML geeignet wäre, wenn es sich um ein naturgemäß leeres Element handelt. Man würde, wenn man unbedingt SimpleXML nutzen will, das Element obligatorisch machen und z.B. <e2>true</e2> oder <e2>false</e2> notieren.
Jedes nicht existente Elemente ist gemäß diesem Konzept von SimpleXML dasselbe wie jedes leere Elements, nämlich ein leerer String. In jedem Kontext, in dem ein String erwartet wird, wird das SimpleXMLObject eines nicht vorhandenen Elements also zu einem leeren String. Daher wäre unter der Voraussetzung, dass e2 immer einen Textinhalt hat, wenn es existiert, folgendes denkbar:
if ($oE1->e2 != '') {
echo('Element existiert (und hat Textinhalt)');
}
Man könnte auch alle Kindobjekte durchlaufen und überprüfen, ob ein e2-Element darunter ist:
$element_gefunden = false;
foreach ($oE1 as $element => $wert) {
if ($element = 'e2') {
$element_gefunden = true;
break;
}
}
Eine Unterscheidung zwischen »existent, aber leer« und »nicht existent« ist hier direkt möglich. Das Element kann ruhig leer sein.
Gegenüber deinen XPath-Abfragen ist das natürlich nicht sonderlich eleganter.
Das nur der Vollständigkeit halber, da jemand einwenden könnte, es funktioniere entgegen meiner Aussage. Wie gesagt lohnt sich SimpleXML eher bei bestimmten Markup-Datenstrukturen. Man kann freilich das Markup anpassen, oder aber direkt DOM-Methoden einsetzen.
Mathias