Extraer tanto el texto como el atributo de un nodo determinado mediante Xpath

StackOverflow https://stackoverflow.com/questions/141913

  •  02-07-2019
  •  | 
  •  

Pregunta

Estoy analizando los resultados XML de una llamada a la API usando PHP y 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 alguna forma de acceder al texto y al atributo desde una consulta? Y si es así, ¿cómo se llega a esos elementos una vez que se ejecuta la consulta?

¿Fue útil?

Solución

Después de echar un vistazo alrededor encontré esta solución. De esta manera puedo obtener el texto del elemento y acceder a cualquier atributo 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');
}

Otros consejos

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

// a: Libros / texto () | // a: Books / @ DeweyDecimal

Toma nota del uso del operador de unión de XPath en la expresión de arriba.

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

Si solo está recuperando valores de su documento XML, SimpleXML podría ser la solución más ágil, rápida y amigable con la memoria:

$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'];
}

¿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 puede construir cualquier formato específico de valor de retorno que desee dentro de la expresión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top