2012-09-05 7 views
6

Estoy trabajando con PHP y XPath conectando a una API remota basada en XML. Una respuesta de muestra del servidor es la siguiente.Cómo usar XPath para verificar si existe el nodo <Success />

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

Se puede ver que no hay etiqueta de comienzo <Success> así que ¿cómo puedo buscar la existencia de <Success /> usar Xpath?

Gracias Simon

+1

La manera normal, ¿qué has probado? – Musa

Respuesta

7

El elemento <Success /> es un empty element, lo que significa que no tiene ningún valor. Es a la vez, Etiqueta de inicio y finalización.

Puede test for existence of nodes with the XPath function boolean()

La función booleana convierte su argumento a un valor lógico de la siguiente manera:

  • un número es verdadero si y sólo si no es ni positiva o negativa cero ni NaN
  • un conjunto de nodos es verdadero si y solo si no está vacío
  • una cadena es verdadera si y solo si su longitud es distinta de cero
  • un objeto de un tipo distinto a los cuatro tipos básicos se convierte en un valor lógico de una manera que depende de ese tipo

Para hacer eso con DOMXPath es necesario utilizar el método DOMXPath::evaluate() porque devolverá un resultado escrito, en este caso un 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


Por supuesto, también puede simplemente consultar los /OTA_PingRS/Success y ver si hay resultados en el DOMNodeList devuelto:

$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


También puede utilizar SimpleXML:

$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

Gracias por la respuesta detallada. Muy apreciado. – PrestonDocks

2

La sintaxis:

<Success /> 

es exactly equivalent a

<Success></Success> 

Con el fin de probar la existencia de <Success />, sólo tiene que utilizar un camino como éste:

//OTA_PingRS/Success[1] 

Puede ahora prueba uf el resultado está vacía . En caso afirmativo, el elemento <Success /> no está presente.

+0

Gracias por la respuesta, esto me ayudó a entender mejor cómo xpath y simplexml manejan los datos XML. – PrestonDocks

0

Utilice la función para verificar el valor booleano del xpath que desea verificar la existencia.

Cuestiones relacionadas