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

1voto

Mike Chelen Punkte 382

Die 3 Möglichkeiten, die ich bestätigen kann, dass sie in PHP 5.5.23 funktionieren, waren isset() count() o empty()

Hier ist ein Skript, das die Ergebnisse von jedem zeigt:

https://gist.github.com/mchelen/306f4f31f21c02cb0c24

1voto

phse Punkte 2508

Ich verwende eine Hilfsfunktion, um zu prüfen, ob ein Knoten ein gültiger Knoten ist, der als Parameter in einer Funktion bereitgestellt wird.

private static function isValidNode($node) {
  return isset($node) && $node instanceof SimpleXMLElement && !empty($node);
}

Beispiel für die Verwendung:

public function getIdFromNode($node) {
  if (!self::isValidNode($node)) {
    return 0;
  }
  return (int)$node['id'];
}

0voto

user857276 Punkte 1369

Ich dachte, ich teile meine Erfahrungen. Unter 5.4 habe ich versucht, mit 'isset' und 'empty' zu testen, aber beides hat bei mir nicht funktioniert. Ich benutzte schließlich ist_null .

if(!is_null($xml->scheduler->outterList->innerList)) {
    //do something
}

0voto

g-man Punkte 64

Name Räume

Beachten Sie, dass Sie, wenn Sie in Ihrer XML-Datei Namensräume verwenden, diese in Ihre Funktionsaufrufe einbeziehen müssen, wenn Sie nach Kindern suchen, sonst wird jedes Mal NULL zurückgegeben:

if ($XMLelement->children($nameSpace,TRUE)->count()){
    //do something here 
}

0voto

Pancho Punkte 1760

Ich kann nicht für frühere Versionen sprechen, aber in PHP 8.0 wird die folgende einzeilige Funktion verwendet:

function elementExists(?SimpleXMLElement $element) : bool {
  return is_null($element)?false:@count($element);
}

$A = new SimpleXMLElement('<A><b><c/></b></A>');  // doc contains c
$B = new SimpleXMLElement('<B><b/></B>');         // doc does not contain c 
$C = new SimpleXMLElement('<C><x><c/></x></C>');  // doc contains c but different heirarchy

print '$A contains ->b->c : ' . (elementExists($A->b->c)?"true":"false") . PHP_EOL;
print '$B contains ->b->c : ' . (elementExists($B->b->c)?"true":"false") . PHP_EOL;
print '$C contains ->b->c : ' . (elementExists($C->b->c)?"true":"false") . PHP_EOL;

renvoie à

$A contains ->b->c : true
$B contains ->b->c : false
$C contains ->b->c : false

d.h. korrekt bestimmt, ob c vorhanden ist und sich an der gewünschten Stelle befindet.

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