2016-04-20 3 views
1

Ich bekomme Daten von einem XML-Objekt in PHP und verwenden Sie den "==" -Operator, aber wir bekommen keine Gleichheit. Es scheint eine sehr grundlegende Frage zu sein, aber ich kann sie nirgends finden.PHP Xml Objekt vergleichen

Minimal Beispiel:

<?php 
// Load the file 
$xmlData = "<?xml version='1.0' encoding='UTF-8' ?> 
<root> 
<a>animalia</a> 
<b>arthropoda 
<parent>animalia</parent> 
</b> 
</root>"; 

$xml=simplexml_load_string($xmlData) or die("Error: Cannot create object"); 
print_r($xml); 

//Extract the data 

$x=$xml->a; 
$y=$xml->b->parent; 

// Test whether they are equal 

if ($x==$y) { 
    echo $x." = ".$y; 
} 
else { 
    echo "'".$x."' does not equal '".$y."'"; 
} 
?> 

Das gibt mir das Ergebnis: 'animalia' nicht gleich 'animalia'

Hinweis, wenn ich schreibe entweder

print_r($x); 

oder

print_r($x); 

Ich bekomme die Ausgabe: SimpleXMLElement Objekt ([0] => animalia)

Die Frage ist also, warum diese nicht als gleich angesehen werden? Danke im Voraus.

+0

'trim()' sie beide und versuchen Sie es erneut

Um Knotenwerte, Gussobjekte als Zeichenfolge zu vergleichen. –

Antwort

0

trim - Leerzeichen entfernen (oder andere Zeichen) vom Anfang und Ende eines Strings

<?php 
// Load the file 
$xmlData = "<?xml version='1.0' encoding='UTF-8' ?> 
<root> 
<a>animalia</a> 
<b>arthropoda 
<parent>animalia</parent> 
</b> 
</root>"; 

$xml=simplexml_load_string($xmlData) or die("Error: Cannot create object"); 
print_r($xml); 

//Extract the data 
$x=$xml->a; 
$y=$xml->b->parent; 
// Test whether they are equal 
if (trim($x)==trim($y)) { 
    echo $x." = ".$y; 
} 
else { 
    echo "'".$x."' does not equal '".$y."'"; 
} 
?> 

Ausgang:

animalia = animalia 

XML Whitespaces

+0

Danke, dass für mich gearbeitet hat, auch am realen Beispiel, das ein wenig mehr beteiligt ist. Ich denke, dass der Trim-Befehl sie auch in Strings umwandelt, was ebenfalls wichtig ist. Danke noch einmal. –

+0

@TimX, herzlich willkommen, froh, Ihnen zu helfen .. wenn irgendeine der Antwort für Sie nützlich ist, vergessen Sie nicht, diese Antwort zu wählen Danke ... –

0

Sie über das Lesen nicht den Vergleich von zwei Strings , Sie vergleichen zwei verschiedene Knoten (<a>animalia</a> vs <parent>animalia</parent>).

Sie sind zwei verschiedene SimpleXML Objekte.

if((string) $x == (string) $y) 

oder:

if($x->__toString() == $y->__toString()) 
+0

Danke für die klare Erklärung und die Methode, die an meinem min. Arbeitete Beispiel. Mein reales Beispiel generiert auch Leerraum, also musste ich trimmen, wie Manjeet Barnala vorgeschlagen hat, und ich nehme an, dass dies auch in Strings als Nebenprodukt umgewandelt wird. –

+0

Ja. 'trim' und andere String-Methoden werfen das Objekt als String. Wenn ein Objekt (nicht nur SimpleXML objs) eine '__toString()', Methode hat, wird es bei Bedarf aufgerufen. – fusion3k