65 Stimmen

php SimpleXML prüft, ob ein Kind existiert

A->b->c existieren könnte, aber c möglicherweise nicht existiert. Wie kann ich das überprüfen?

1 Stimmen

Bitte wählen Sie eine neue Antwort

4voto

Alex Matulich Punkte 101

Wenn Sie PHP 5.3 haben, können Sie einfach $a->count() . Andernfalls wird die Lösung von scippie mit @count($a->children()) funktioniert gut. Ich finde, dass ich das @ nicht brauche, aber ältere PHP-Implementierungen brauchen es vielleicht.

0 Stimmen

Dies sollte die akzeptierte Antwort sein, die derzeit akzeptierte ist falsch.

3voto

user1391077 Punkte 63

Die Methode xpath liefert ein Array mit übereinstimmenden Elementen oder false

if(false !== $A->xpath('b/c')) { ...

http://www.php.net/manual/ru/simplexmlelement.xpath.php

4 Stimmen

Nein, die Docs geben an, dass es FALSE zurückgibt, wenn ein Fehler vorliegt, nicht wenn der Pfad keine Ergebnisse liefert.

0 Stimmen

Getestet, @Brian hat recht, es wird nur false zurückgegeben, wenn ein Fehler auftritt. Verwenden Sie diese Prüfung nicht, sie wird immer einen (leeren) Knoten zurückgeben.

3voto

Oğuz Can Sertel Punkte 719

Einfach

var_dump(count($xml->node));

0 Stimmen

In PHP7.2 wurde eine Warnung hinzugefügt, wenn etwas gezählt wird, das die Schnittstelle Countable nicht implementiert. Dies sollte also berücksichtigt werden und besser isset() als count() verwendet werden.

3voto

Daydah Punkte 362

Verwendung von if(isset($A->b){ gab mir Probleme, also habe ich versucht if($A->b){ und es hat funktioniert!

2 Stimmen

count und "cast to boolean" sind die beiden Möglichkeiten, die sinnvoll sind. Verwendung von if wie Sie beschreiben, ist der kürzeste Weg, um einen booleschen Wert zu erzeugen.

2voto

CITBL Punkte 1427

Xpath verwenden:

function has_child(\SimpleXMLElement $parent=null, string $xpathToChild)
{
    return isset($parent) && !empty($parent->xpath('('.$xpathToChild.')[1]'));
}

donde $parent ein indirekter oder direkter Elternteil des zu prüfenden untergeordneten Knotens ist und $xpathToChild ist ein xpath des Childs relativ zu $parent .

()[1] ist, weil wir nicht alle Kindknoten auswählen wollen. Einer ist genug.

Prüfen, ob $a->b->c existiert:

has_child($a,'b/c');

Sie können auch nach Attributen suchen. Um zu prüfen, ob der Knoten c hat die t Attribut.

has_child($a,'b/c/@t');

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X