Pergunta

Eu sou analisar resultados XML a partir de uma chamada de API usando PHP e 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');
 }

Isso funciona, mas há uma maneira que eu possa acessar o texto e o atributo de uma consulta? E se assim como você começa a esses itens uma vez consulta é executada?

Foi útil?

Solução

Depois de fazer algumas olhando em volta me deparei com esta solução. Dessa forma eu posso obter o texto do elemento e acesso quaisquer atributos do nó.

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

Outras dicas

Uma expressão XPath única que irá selecionar ambos os nós de texto de "A: Livros" e seu atributo "DeweyDecimal", é o seguinte

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

Do nota o uso de operador de união do XPath na expressão acima.

Outra nota : tentar evitar usar o "//" abreviatura, pois pode causar todo o documento XML a ser percorrido e, portanto, é muito caro. Recomenda-se utilizar uma expressão XPath mais específico (tal como consistindo de uma cadeia de passos de localização específicas) sempre quando a estrutura do documento XML é conhecido.

Se seu está apenas recuperar valores a partir do documento XML, SimpleXML pode ser o mais magro, mais rápido e solução de memória-amigável:

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

Você poderia consulta para a concatenação?

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

XSLT é uma linguagem de expressão em si mesmo, e você pode construir qualquer formato específico de valor de retorno que você quer de dentro da expressão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top