2008-09-26 20 views
5

Estoy analizando los resultados XML de una llamada API utilizando PHP y xpath.Extrayendo el texto y el atributo de un nodo determinado mediante Xpath

$dom = new DOMDocument(); 
$dom->loadXML($response->getBody()); 

$xpath = new DOMXPath($dom); 
$xpath->registerNamespace("a", "http://www.example.com"); 

$hrefs = $xpath->query('//a:Books/text()', $dom); 

for ($i = 0; $i < $hrefs->length; $i++) { 
     $arrBookTitle[$i] = $hrefs->item($i)->data; 
} 

$hrefs = $xpath->query('//a:Books', $dom); 

for ($i = 0; $i < $hrefs->length; $i++) { 
     $arrBookDewey[$i] = $hrefs->item($i)->getAttribute('DeweyDecimal'); 
} 

Esto funciona, pero hay una manera de que pueda acceder tanto el texto como el atributo de una consulta? Y si es así, ¿cómo se llega a esos elementos una vez que se ejecuta la consulta?

Respuesta

4

Después de mirar un poco encontré esta solución. De esta forma puedo obtener el texto del elemento y acceder a los atributos del nodo.

$hrefs = $xpath->query('//a:Books', $dom); 

for ($i = 0; $i < $hrefs->length; $i++) { 
    $arrBookTitle[$i] = $hrefs->item($i)->nodeValue; 
    $arrBookDewey[$i] = $hrefs->item($i)->getAttribute('DeweyDecimal'); 
} 
0

¿Podría consultar la concatenación?

$xpath->query('concat(//a:Books/text(), //a:Books/@DeweyDecimal)', $dom); 

XSLT es un lenguaje de expresión en sí mismo, y se puede construir cualquier formato específico del valor de retorno que desee dentro de la expresión.

+0

Entonces, ¿solo usaría el elemento-> datos y elemento-> getAttribute para obtener los resultados? –

+0

No estoy seguro de cómo funciona la biblioteca XSLT de PHP, pero es posible que pueda obtenerla solo con item-> data. Vale la pena intentarlo, de todos modos. –

2

Si tu estás simplemente recuperar valores desde el documento XML, SimpleXML podría ser el más delgado, más rápido y más amigable memoria de solución:

$xml=simplexml_load_string($response->getBody()); 
$xml->registerXPathNamespace('a', 'http://www.example.com'); 
$books=$xml->xpath('//a:Books'); 
foreach ($books as $i => $book) { 
    $arrBookTitle[$i]=(string)$book; 
    $arrBookDewey[$i]=$book['DeweyDecimal']; 
} 
3

Una sola expresión XPath que seleccionará a los nodos de texto de "a: Libros" y su atributo "DeweyDecimal", es la siguiente

//a:Books/text() | //a:Books/@DeweyDecimal

Observe el uso del operador de unión de XPath en la expresión anterior.

Otra nota: intente evitar el uso de la abreviatura "//" ya que puede hacer que se atraviese todo el documento XML y, por lo tanto, es muy caro. Se recomienda utilizar una expresión XPath más específica (como por ejemplo, una cadena de pasos de ubicación específicos) siempre que se conozca la estructura del documento XML.

Cuestiones relacionadas