2012-09-05 3 views
6

Ich arbeite mit PHP und XPath Verbindung zu einer Remote-XML-basierten API. Eine Beispielantwort vom Server ist wie folgt.Wie XPath zu verwenden, um zu überprüfen, ob <Success /> Knoten existiert

<OTA_PingRS> 
     <Success /> 
     <EchoData>This is some test data</EchoData> 
    </OTA_PingRS> 

Sie sehen können, gibt es keine Start-Tag ist <Success> so wie ich für die Existenz von <Success /> Suche XPath?

Dank Simon

+1

Der normale Weg, was hast du versucht? – Musa

Antwort

7

Das <Success /> Element ist ein empty element, was bedeutet, es hat keinen Wert. Es ist beides, Start- und End-Tag.

Sie können test for existence of nodes with the XPath function boolean()

Die Boolesche Funktion wandelt in einen boolean ihr Argument wie folgt:

  • eine Zahl wahr ist, wenn und nur wenn sie weder positiv oder negativ Null noch NaN ist
  • ein Node-Set ist wahr, wenn und nur wenn es nicht leer ist
  • ein String ist wahr, wenn und nur wenn seine Länge nicht Null ist
  • ein Objekt von einem anderen Typ als die vier Grundtypen in einer Art und Weise in einen Booleschen umgewandelt, die auf diesem Typ abhängig ist

Um das zu tun mit DOMXPath Sie die DOMXPath::evaluate() Methode verwenden müssen, weil es wird eine typisierte Ergebnis, in diesem Fall das Rück ein boolean:

$xml = <<< XML 
<OTA_PingRS> 
    <Success /> 
    <EchoData>This is some test data</EchoData> 
</OTA_PingRS> 
XML; 

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

$xpath = new DOMXPath($dom); 
$successNodeExists = $xpath->evaluate('boolean(/OTA_PingRS/Success)'); 

var_dump($successNodeExists); // true 

demo


Natürlich können Sie auch für /OTA_PingRS/Success abfragen einfach und sehen, ob es Ergebnisse in der zurück DOMNodeList:

$xml = <<< XML 
<OTA_PingRS> 
    <Success /> 
    <EchoData>This is some test data</EchoData> 
</OTA_PingRS> 
XML; 

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

$xpath = new DOMXPath($dom); 
$successNodeList = $xpath->evaluate('/OTA_PingRS/Success'); 

var_dump($successNodeList->length); 

demo


Sie können auch SimpleXML verwenden:

$xml = <<< XML 
<OTA_PingRS> 
    <Success /> 
    <EchoData>This is some test data</EchoData> 
</OTA_PingRS> 
XML; 

$nodeCount = count(simplexml_load_string($xml)->xpath('/OTA_PingRS/Success')); 

var_dump($nodeCount); // 1 
+0

Vielen Dank für die ausführliche Antwort. Sehr geschätzt. – PrestonDocks

2

Die Syntax:

<Success /> 

ist exactly equivalent zu

<Success></Success> 

Um die Existenz von <Success /> zu testen, können Sie einfach einen Pfad wie folgt verwenden:

//OTA_PingRS/Success[1] 

Sie können nun Test uf das Ergebnis ist leer . Wenn ja, ist das Element <Success /> nicht vorhanden.

+0

Danke für die Antwort, dies half mir besser zu verstehen, wie Xpath und Simplex XML Daten verarbeiten. – PrestonDocks

0

Verwenden Sie die Funktion , um den booleschen Wert des X-Pfads zu prüfen, den Sie auf Vorhandensein überprüfen möchten.

Verwandte Themen