Question

J'analyse les résultats XML d'un appel API à l'aide de PHP et 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');
 }

Cela fonctionne, mais y a-t-il un moyen d'accéder à la fois au texte et à l'attribut à partir d'une requête? Et si oui, comment vous rendre à ces éléments une fois la requête exécutée?

Était-ce utile?

La solution

Après quelques recherches, je suis tombé sur cette solution. De cette façon, je peux obtenir le texte de l'élément et accéder aux attributs du nœud.

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

Autres conseils

Une seule expression XPath permettant de sélectionner les deux nœuds de texte de "a: Books". et leurs "DeweyDecimal". attribut, est le suivant

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

Notez l'utilisation de l'opérateur d'union de XPath dans l'expression ci-dessus.

Autre remarque : essayez d'éviter d'utiliser le " // " l’abréviation car elle peut entraîner la traversée de l’ensemble du document XML et est donc très coûteuse. Il est recommandé d’utiliser une expression XPath plus spécifique (consistant par exemple en une chaîne d’étapes d’emplacement spécifiques), toujours lorsque la structure du document XML est connue.

Si vous venez de récupérer des valeurs de votre document XML, SimpleXML pourrait être la solution plus légère, plus rapide et plus conviviale:

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

Pourriez-vous interroger la concaténation?

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

XSLT est un langage d’expression en soi, et vous pouvez construire n’importe quel format spécifique de valeur de retour à partir de l’expression.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top