Conheça a Biblioteca QueryPath PHP

Uma maneira rápida e fácil de trabalhar com XML e HTML

HTML, HTTP e XML são indiscutivelmente o triunvirato que forma a estrutura básica da tecnologia da Web. Para o desenvolvedor de PHP, trabalhar com eles pode ser frustrante. A nova biblioteca QueryPath, prima PHP da biblioteca jQuery JavaScript, oferece uma API eficiente para trabalhar com XML, HTML e HTTP. De páginas da Web a serviços da Web, SVG a SPARQL, RDF a Atom, QueryPath fornece uma API robusta, mas simples, para desenvolvimento contemporâneo para a Web em PHP. Neste artigo, aprenda como construir objetos QueryPath e como passar por e manipular XML e HTML. Percorra um exemplo que usa QueryPath para acessar um serviço da Web (Twitter).

Matt Butcher, Senior Programmer, Palantir.net

Matt ButcherMatt Butcher desenvolve aplicativos da Web há mais de 12 anos. É autor de cinco livros sobre tecnologia, incluindo Drupal 6 JavaScript and jQuery e Mastering OpenLDAP. Trabalhou em mecanismos de procura, Linux integrado, sistemas de gerenciamento de conteúdo e redes semânticas. Possui mestrado em filosofia e é atualmente é doutorando.



28/Abr/2009

Introdução

É possível argumentar que, nos últimos 15 anos, as três tecnologias que contribuíram para o crescimento explosivo da Web são HTML, HTTP e XML. É possível expandir sobre esse triunvirato, apontando, possivelmente, para CSS, JavaScript e tecnologias semelhantes. Mas as "três grandes" permanecem sem desafio no topo da lista.

PHP também marcou presença no mundo de desenvolvimento da Web. PHP potencializa Web sites a partir de pequenas páginas iniciais para semelhantes ao Yahoo!, principalmente devido à sua facilidade de desenvolvimento e modelo centrado na Web. Mas usar PHP para trabalhar com as três grandes — principalmente com XML — pode ser complicado, às vezes. Neste artigo, aprenda sobre QueryPath, uma biblioteca PHP projetada com dois objetivos em mente:

  • Simplicidade, para facilitar o trabalho com HTML, XML e HTTP
  • Robustez, para fornecer um rico site de ferramentas para trabalhar com essas tecnologias

Este artigo explora a construção de objetos QueryPath, passando por XML e HTML, manipulando XML e HTML e usando QueryPath para acessar um serviço da Web (Twitter é o serviço de exemplo).

A próxima seção possui uma breve introdução para a biblioteca e seu design.


QueryPath

Por simplicidade, QueryPath usa uma sintaxe compacta. Os nomes dos métodos são custos e representativos do que fazem (por exemplo, text(), append(), remove()). Como a maioria dos métodos retorna um objeto QueryPath , as chamadas de método são encadeáveis, o que significa que diversos métodos podem ser chamados em uma sequência. Essa convenção é, às vezes, chamada de interface fluente. Para manter as coisas familiares para desenvolvedores de JavaScript, QueryPath implementa a maioria das funções e comportamentos de passagem e manipulação jQuery.

Para robustez, QueryPath fornece ferramentas projetadas para abordar casos de uso típico para carregar, procurar, ler e gravar conteúdo XML e HTML. Nem tudo pode ser atendido por uma API de propósito geral, no entanto, independentemente do tamanho da biblioteca. Para abordar o problema, QueryPath inclui um mecanismo de extensão que permite incluir novos métodos em QueryPath. QueryPath também inclui extensões para incluir suporte a banco de dados, suporte a modelo e recursos XML adicionais.

Você pode estar pensando: "Por que outra ferramenta XML ou HTML? PHP V5 já possui um monte de ferramentas XML, inclusive uma implementação de Document Object Model (DOM) e a biblioteca SimpleXML. Por que incluir outra?" A resposta curta: QueryPath foi projetada para ser uma ferramenta de finalidades gerais. A API DOM é complexa e incômoda. Seu modelo orientado a objetos pode ser poderoso, mas mesmo as tarefas mais simples podem usar dúzias de linhas de código. SimpleXML, por outro lado, é muito simples para muitas tarefas de programação. A menos que o XML seja inteiramente previsível, navegar por um documento SimpleXML pode ser tudo, menos simples.

QueryPath é uma tentativa de localizar o ponto ideal entre a riqueza de recursos de DOM e a simplicidade de SimpleXML.

Requisitos

QueryPath é uma biblioteca PHP pura. Para usá-la, simplesmente faça download a partir do Web site oficial e inclua a mesma no caminho de biblioteca PHP.

QueryPath possui requisitos mínimos do sistema. Funcionará no PHP V5, desde que a extensão DOM esteja ativada. A maioria das distribuições do PHP V5 atende esse requisito da maneira como são fornecidas. QueryPath não suporta o PHP V4 há muito reprovado.


Anatomia de uma Cadeia QueryPath

Há quatro conceitos centrais para o uso típico de QueryPath:

  • Um objeto QueryPath está associado a um documento XML ou HTML simples.
  • QueryPath pode consultar o documento, identificando um conjunto de correspondências no documento.
  • Documentos podem ser manipulados por QueryPath. Novas partes podem ser incluídas, partes existentes podem ser modificadas e partes indesejadas podem ser removidas.
  • Os métodos QueryPath podem ser encadeados para executarem muitas operações em uma sequência compacta. Em apenas algumas linhas de código, um documento pode ser carregado, analisado, consultado, modificado e gravado.

O código da Lista 1 ilustra todos esses pontos.

Lista 1. Cadeia QueryPath Básica
<?php
require 'QueryPath/QueryPath.php';

qp('sample.html')->find('title')->text('Hello World')->writeHTML();
?>

O exemplo acima requer uma biblioteca. QueryPath/QueryPath.php. Esse é o único arquivo que precisa ser incluído para usar QueryPath, a menos que também esteja carregando extensões do QueryPath.

Sintaxe do Objeto PHP

Os desenvolvedores de PHP com experiência processual podem não estar familiarizados com a sintaxe orientada a objetos de PHP. Um objeto pode ter funções anexadas a ele. As funções são chamadas de métodos. Os métodos de um objeto são chamados usando-se o operador de objeto (->).

A próxima linha de código do exemplo é uma cadeia QueryPath, que faz o seguinte:

  1. Cria um novo objeto QueryPath que aponta para o documento sample.html. Quando qp() é executado, criará um novo objeto QueryPath , que irá, subsequentemente, carregar e analisar o documento.
  2. Usando o método find() , procura o documento usando o seletor de cascading style sheet (CSS) 3 title, que procura todos os elementos <title/> .

    Em um documento HTML válido, isso corresponderá somente ao único elemento <title/> no início do documento.

  3. O valor do texto do título é configurado para Hello World. Quando isso é executado, os nós filhos do título serão substituídos pela cadeia CDATA (dados de caractere) Hello World. Qualquer conteúdo existente será destruído.
  4. Todo o documento será gravado na saída padrão com o método writeHTML() .

O exemplo acima pode, na verdade, ser reduzido um pouco, já que a função factory qp() aceita um seletor CSS como um segundo parâmetro opcional. A Lista 2 mostra a versão reduzida.

Lista 2. Versão Abreviada da Cadeia QueryPath Básica
<?php
require 'QueryPath/QueryPath.php';

qp('sample.html', 'title')->text('Hello World')->writeHTML();
?>

Supondo que sample.html seja simplesmente um documento HTML básico, o resultado do exemplo acima ( Lista 1 ou Lista 2) seria semelhante à Lista 3. A linha em negrito contém o título configurado.

Lista 3. Exemplo do HTML Gerado
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
	<title>Hello World</title>
</head>
<body>
</body>
</html>

Esses exemplos simples mostram as famílias de tarefas gerais que QueryPath pode executar. As próximas seções exploram a famílias de métodos. Após isso, esses blocos de construção serão montados para criar um cliente de serviço da Web simples.


A Função Factory qp()

A função usada mais frequentemente na biblioteca QueryPath é a função factory qp() . Essencialmente, executa a tarefa de criar novos objetos QueryPath. É usada a favor de um construtor tradicional.

Caso esteja familiarizado com padrões de design orientados a objetos, seria possível reconhecer qp() como uma variante do padrão factory. Em vez de definir uma classe factory com um método construtor, QueryPath usa simplesmente uma função. Juntamente com o salvamento de alguns pressionamentos de tecla (importante ao encadear métodos), essa abordagem mantém QueryPath apenas um pouco mais próximo de jQuery e reduz a curva de aprendizado caso seja familiarizado com jQuery.

Um objeto QueryPath será associado a um único documento XML ou HTML. O documento está ligado ao objeto QueryPath quando o objeto é construído. Uma função qp() aceita três argumentos, todos os quais são opcionais:

Um documento
Pode ser um nome de arquivo ou uma URL, uma cadeia XML ou HTML, um DOMDocument ou DOMElement, um SimpleXMLElement ou uma matriz de DOMElements. Se algo for fornecido aqui, QueryPath criará um documento XML vazio para manipulação.
Um seletor CSS3
Se for fornecido, QueryPath irá, ao carregar o documento, consultar esse documento usando o seletor fornecido.
Uma array de opções associada
Fornece um método para passar um conjunto complexo de parâmetros de configuração para essa instância específica de QueryPath. A referência da API detalha as opções que podem ser passadas aqui.

XML ou HTML?

QueryPath funciona com XML e HTML, mas os dois formatos têm algumas diferenças. QueryPath tenta detectar automaticamente qual formato está sendo usado e ajustar-se conforme necessário. XHTML (HTML implementado em XML) é tratado como XML.

qp() aceita tantos tipos de dados para o primeiro argumento para facilitar a construção de um objeto QueryPath. QueryPath pode iniciar com um nome de arquivo ou URL e carregar um documento. Se uma cadeia de XML ou HTML for passada, QueryPath analisará o conteúdo. E, é claro, pode receber documentos nas duas outras representações de objetos comuns de um documento XML: DOM e SimpleXML. A Lista 4 mostra como a função qp() pode analisar uma cadeia que contém XML.

Lista 4. Construindo um Objeto QueryPath a partir de uma Cadeia XML
<?php
require 'QueryPath/QueryPath.php';

$xml = '<?xml version="1.0"?><doc><item/></doc>';
$qp  = qp($xml);
?>

Quando o código da Lista 4 é executado, $qp fará referência a um objeto QueryPath que aponta internamente para uma representação analisada do XML. Um exemplo anterior passou um nome de arquivo. Se PHP for configurado para permitir wrappers de fluxo HTTP/HTTPS (que é padrão na maioria das distribuições do PHP V5), é possível até mesmo carregar URLs HTTP remotas, conforme mostrado abaixo.

Lista 5. Construindo um Objeto QueryPath a partir de uma URL
<?php
require 'QueryPath/QueryPath.php';

$qp = qp('http://example.com/file.xml');
?>

Isso possibilita acessar serviços da Web usando QueryPath. (Contextos de fluxo podem ser passados usando-se o terceiro parâmetro de qp() , permitindo o um ajuste fino das configurações de conexão.) Ao criar um novo documento, há um atalho para adicionar o HTML padrão, conforme mostrado abaixo.

Lista 6. Usando a Constante QueryPath::HTML_STUB
<?php
require 'QueryPath/QueryPath.php';

$qp = qp(QueryPath::HTML_STUB);
?>

A constante QueryPath::HTML_STUB define um documento HTML básico, conforme mostrado abaixo.

Lista 7. Documento QueryPath::HTML_STUB
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
	<title>Untitled</title>
</head>
<body></body>
</html>

Iniciar a partir deste documento de estrutura básica tornará a geração de HTML ainda mais rápida.

Agora, você sabe como criar um novo objeto QueryPath que aponta para um documento e também viu um seletor CSS simples. A próxima seção cobre como QueryPath pode ser usada para passar por documentos.

Passando por um Documento

Após abrir um documento, é necessário percorrer o documento para localizar o conteúdo de interesse. QueryPath está projetado para facilitar isso. Para facilitar as diversas necessidades de passagem, QueryPath fornece diversos métodos para passagem. A maioria permite o uso de seletores CSS3 para localizar os nós desejados.

Figura 1. Métodos Importantes de Passagem pelo QueryPath
Métodos Importantes de Passagem pelo QueryPath

A Figura 1 resume as funções de passagem comumente usadas. Cada uma é descrita abaixo. Apesar de haver outros métodos de passagem, aqueles discutidos aqui cobrem a maioria das necessidades típicas.

Tabela 1. Métodos de Passagem Comuns
MétodoDescriçãoAceita o seletor CSS?
find()Selecionar qualquer elemento (abaixo dos nós atualmente selecionados) que corresponda ao seletor Sim
xpath()Selecionar quaisquer elementos que correspondam à consulta XPath em questãoNão (em vez disso, a consulta XPath)
top()Selecionar o elemento de documento (o elemento-raiz)Não
parents()Selecionar qualquer elemento anteriorSim
parent()Selecionar o elemento-pai diretoSim
siblings()Selecionar todos os irmãos (anteriores e próximos)Sim
next()Selecionar o próximo elemento irmãoSim
nextAll()Selecionar todos os irmãos após o elemento presenteSim
prev()Selecionar o irmão anteriorSim
prevAll()Selecionar todos os irmãos anterioresSim
children()Selecionar elementos imediatamente abaixo desteSim
deepest()Selecionar o nó ou nós mais profundos abaixo desteNão

Muitos métodos em QueryPath podem efetuar consultas que especificam ainda mais quais itens devem ser selecionados. Conforme mostrado na terceira coluna da Tabela 1, quase todos esses métodos aceitam um seletor CSS3 como um parâmetro opcional. (A função xpath() aceita uma consulta XPath em vez de um seletor CSS3.) Somente top() e deepest() não aceitam uma consulta como um argumento.

Verifique outro exemplo simples para ver como a passagem funciona. Suponhamos que haja um documento XML como o abaixo.

Lista 8. Um Documento XML Simples
<?xml version="1.0"?>
<root>
  <child id="one"/>
  <child id="two"/>
  <child id="three"/>
  <ignore/>
</root>

O elemento <root/> tem quatro filhos: três são denominados <child/> e um é denominado <ignore/>. Você poderia selecionar todos os quatro filhos de <root/> com uma consulta QueryPath.

Lista 9. Selecionando Todos os Filhos
<?php
require 'QueryPath/QueryPath.php';

$xml = '<?xml version="1.0"?>
<root>
  <child id="one"/>
  <child id="two"/>
  <child id="three"/>
  <ignore/>
</root>';

$qp = qp($xml, 'root')->children();
print $qp->size();
?>

O método children() selecionaria todos os filhos imediatos do elemento <root/> . A última linha, que imprime o número de itens correspondentes no objeto QueryPath , imprimirá 4.

Suponhamos que você queira selecionar somente os três elementos <child/> , mas não o elemento <ignore/> . A Lista 10 mostra como é possível fazer isso.

Lista 10. Consultando com um Filtro
<?php
require 'QueryPath/QueryPath.php';

$xml = '<?xml version="1.0"?>
<root>
<child id="one"/>
<child id="two"/>
<child id="three"/>
<ignore/>
</root>';

$qp = qp($xml, 'root')->children('child');

print $qp->size();
?>

A instrução print final imprimirá o número de itens atualmente selecionados por QueryPath. Retornará 3. Internamente, QueryPath está controlando essas três correspondências. Elas são armazenadas como o contexto atual. Caso decida executar uma consulta adicional, teria início a partir desses três elementos. Se tivesse tentado anexar dados, os dados seriam anexados nesses três elementos.

Seletores CSS

Atributos CSS

Os seletores CSS3 tratam alguns atributos como atributos especiais. Os atributos id e class têm uma sintaxe dedicada do seletor. Diferentemente de outras tecnologias XML, o DTD ou esquema XML não precisam designar esses atributos como especiais; são tratados dessa forma apenas pelo mecanismo do seletor CSS3.

Os seletores CSS são a parte de uma instrução CSS que selecionar um elemento para o qual um estilo será aplicado. Seletores CSS também podem ser usados fora do contexto de uma folha de estilo. QueryPath usa seletores como uma linguagem de consulta e suporta o conjunto de recursos descrito no padrão de seletores CSS3.

Os seletores CSS têm uma função importante em QueryPath. Foram vistas 10 funções que aceitam um seletor CSS como um argumento. Os seletores usados até o momento são consultas simples de nomes de tags. Os seletores CSS3 são muito mais poderosos do que os exemplos anteriores podem sugerir. Descrições detalhadas de seletores CSS3 estão fora do escopo deste artigo, mas a Tabela 2 fornece exemplos de padrões de seletor comum.

Tabela 2. Padrões Comuns do Seletor CSS3
Padrão do seletorDescriçãoCorrespondência de exemplo
pLocalizar elementos com nome de tag <p/>.<p>
.containerLocalizar elementos com o atributo class configurado para container.<div class="container"/>
#menuLocalizar o elemento com o atributo id configurado para menu. É assim que as procuras baseadas em ID são feitas. <div id="menu"/>
[type="inline"]Localizar elementos onde o atributo type possui o valor inline.<code type="inline"/>
tr > thLocalizar elementos <th> cujo elemento pai imediato seja <tr>.<tr><th/></tr>
table tdLocalizar elementos <td> que possuam um elemento <table> em alguma parte de sua descendência (como um pai ou um avô). <table><tr><td/></tr></table>
li:firstObter o primeiro elemento denominado <li/>. Pseudoclasses suportadas incluem :last, :even e :odd.<li/>
RDF|seqLocalizar elementos <RDF:seq> . QueryPath inclui seletores CSS3 para espaços de nomes XML. O suporte a espaço de nomes se estende a atributos, assim como a elementos. <RDF:seq>

Esses padrões seletores comuns podem ser combinados para construir seletores complexos, como

div.content ul>li:first

Esse seletor procurará qualquer <div/> com a classe content. Dentro de div, procurará todas as listas desordenadas (<ul>), retornando o primeiro item da lista (<li>) para cada lista.

Iterando através de Itens Correspondidos

Você aprendeu sobre duas facetas de passagem de um documento: os métodos fornecidos por QueryPath e o suporte ao seletor CSS3. A terceira faceta está iterando através de itens selecionados.

Um objeto QueryPath é passável. No jargão de PHP, isso significa que o objeto pode ser tratado como um agente iterativo. As estruturas de looping padrão de PHP podem efetuar loop através de elementos selecionados de um objeto QueryPath. Lembre-se do exemplo na Lista 10, uma consulta simples para recuperar três elementos a partir de um documento XML. É usado como a base para o próximo exemplo.

E se você quisesse processar cada item individualmente? É possível fazer isso facilmente, já que QueryPath é capaz de ser usado como um agente iterativo. A Lista 11 mostra um exemplo.

Lista 11. Iterando através de Elementos Selecionados
<?php
require 'QueryPath/QueryPath.php';

$xml = '<?xml version="1.0"?>
<root>
<child id="one"/>
<child id="two"/>
<child id="three"/>
<ignore/>
</root>';

$qp = qp($xml, 'root')->children('child');

foreach ($qp as $child) {
  print $child->attr('id') . PHP_EOL;
}
?>

À medida que o loop foreach itera, designará cada um dos elementos correspondidos à variável $child . No entanto, $child não é apenas o elemento; é um objeto QueryPath que aponta para o elemento atual. Todos os métodos QueryPath usuais estão à sua disposição.

Para manter uma API semelhante àquela de jQuery, QueryPath fornece diversos métodos que agem como acessadores e transformadores — ou getters e setters. Um único método pode, dependendo dos argumentos, recuperar (acessar) dados ou alterar (transformar) dados. A função attr() é um exemplo. qp()->attr('name') recupera o valor de um atributo com o nome name. qp()->attr('name', 'value') configura o valor do atributo name para value. Diversos outros métodos, inclusive text(), html() e xml(), executam tarefa dupla, como acessadores e transformadores.

Como cada item iterado é agrupado em um objeto QueryPath, todos os métodos QueryPath padrão estão à sua disposição com $child. O exemplo acima usa a função attr() , que é um acessador e transformador para os atributos de um elemento.

O método attr() recupera o valor do atributo denominado id. A saída do código acima é mostrada abaixo.

Lista 12. Saída do Exemplo de Iterador na Lista 11
one
two
three

Você aprendeu como passar um documento usando métodos QueryPath, seletores CSS3 e técnicas de iteração. A próxima seção explora como modificar documentos com QueryPath.


Manipulando um Documento

Além de usar QueryPath para procurar um documento, é possível usá-la para incluir, modificar e remover dados de um documento. Na Lista 1 foi dada uma olhada rápida nos recursos de QueryPath. Abaixo, isso é repetido para sua conveniência.

Lista 13. Cadeia QueryPath Básica
<?php
require 'QueryPath/QueryPath.php';

qp('sample.html')->find('title')->text('Hello World')->writeHTML();
?>

Neste exemplo, a função text() é usada para modificar o conteúdo do elemento <title/> . QueryPath fornece aproximadamente uma dúzia de métodos para alterar um documento. A Figura 2 mostra como diversos métodos de modificação usados frequentemente funcionam. Esses métodos incluem ou substituem dados. A tag verde representa o elemento atualmente selecionado.

Figura 2. Métodos QueryPath para Incluir ou Substituir Conteúdo
Métodos QueryPath para Incluir ou Substituir Conteúdo

Cada método aceita dados de cadeia de caracteres, geralmente no formato de fragmentos de HTML ou XML e insere os dados no documento. Os dados ficam, então, imediatamente disponíveis para acesso e manipulação adicional.

Trabalhando com Fragmentos de HTML e XML

Há na verdade duas classes de métodos representadas. Em uma classe, alguns dos métodos funcionam com fragmentos arbitrários de XML, como a seguir.

append()Anexar dados como o último filho de um elemento ou elementos atualmente selecionados
prepend()Pré-anexar dados como o primeiro filho de um elemento ou elementos atualmente selecionados
after()Inserir dados imediatamente após o elemento ou elementos atualmente selecionados
before() Inserir dados imediatamente antes do elemento ou elementos atualmente selecionados
html() Substituir o conteúdo filho do elemento ou elementos atuais em um documento HTML
xml()Substituir o conteúdo filho do elemento ou elementos atuais em um documento XML

Os itens acima esperam um argumento que contém uma cadeia de caracteres de dados XML ou HTML bem-formados. A Lista 14 tem um exemplo com o método html() .

Lista 14. Uma Cadeia QueryPath Básica
<?php
require 'QueryPath/QueryPath.php';

qp($file)->find('div.content')->html('<ul><li>One</li></ul>');
?>

O método remove() está ausente na Figura 2. (O ato de remover é difícil de representar visualmente.) O método remove() remove elementos do documento. Se chamado sem parâmetros, removerá os elementos atualmente selecionados. Mas, como muitos outros métodos QueryPath, remove() aceita um seletor CSS3 como um parâmetro opcional. Quando um seletor é fornecido, itens correspondentes ao seletor serão removidos.

Trabalhando com Atributos

A segunda classe do método na Figura 2 compreende métodos que manipulam atributos em elementos. No exemplo, dois são mostrados.

attr()Obtém o valor ou configura um valor para um determinado atributo em cada elemento selecionado.
addClass()Inclui uma classe para cada elemento da seleção atual.

Há outros métodos relacionados a atributos. Por exemplo, removeClass(), que aceita um nome de classe como um argumento, removerá uma classe individual de um elemento. removeAttr(), que aceita um nome de atributo como um argumento, removerá o atributo denominado de todos os elementos atualmente selecionados.

Agora, chegou a hora de colocar todos esses recursos básicos juntos em algo interessante.


Exemplo: Procurando no Twitter com QueryPath

Twitter é um serviço popular de microblog que permite postar mensagens curtas enquanto segue os microblogs de outros usuários do Twitter. O Twitter fornece um serviço da Web simples que expõe muitos dos recursos da plataforma.

O exemplo a seguir usa QueryPath para executar uma procura no servidor do Twitter e imprimir os resultados como HTML. Essa ferramenta pode ser incluída em um Web site existente para mostrar atividade recente do Twitter em um tópico de interesse.

O servidor de procura do Twitter atende em um servidor HTTP padrão e pode (quando solicitado) retornar resultados de procura no formato Atom XML. Nosso exemplo procurará as cinco postagens mais recentes no Twitter que mencionam QueryPath. Para executar uma procura e retornar o conteúdo no formato Atom, é necessário somente codificar as informações necessárias na URL: http://search.twitter.com/search.atom?rpp=5&q=QueryPath.

As três partes em negrito representam os parâmetros ajustados para esse aplicativo.

.atomIncluir essa extensão indica para o servidor que você deseja conteúdo Atom XML retornado.
rpp=5RPP significa resultados por página. Queremos cinco resultados retornados. Por padrão, os cinco resultados mais recentes serão retornados.
q=QueryPathEssa é a consulta. O Twitter suporta consultas de procura mais complexas, mas isso é tudo que você precisa para este exemplo resumido.

Quando essa URL for carregada, o Twitter retornará um documento XML formatado por Atom. A Lista 15 abaixo mostra uma versão muito simplificada do documento retornado. Somente as informações nas quais você está imediatamente interessado são mostradas aqui (somente uma entrada é mostrada).

Lista 15. Extrato de XML Retornado de uma Procura no Twitter
<?xml version="1.0" encoding="UTF-8"?>
<feed>
  <entry>
    <content type="html">
       Last night I added XSD schema validation and XSL
       Transformation (XSLT) support to &lt;b&gt;QueryPath&lt;/b&gt; (as
       extensions). Will commit them today.
    </content>
    <link type="image/png" rel="image" href="http://example.com/img.jpg"/>
    <author>
      <name>technosophos (M Butcher)</name>
      <uri>http://twitter.com/technosophos</uri>
    </author>
  </entry>
</feed>

A Lista 16 mostra o código resumido de QueryPath que executa a procura, examina minuciosamente o XML retornado e cria um documento.

Lista 16. Processando o XML Retornado com QueryPath
<?php
require 'QueryPath/QueryPath.php';

$url = 'http://search.twitter.com/search.atom?rpp=5&q=QueryPath';
$out = qp(QueryPath::HTML_STUB, 'body')->append('<ul/>')->find('ul');

foreach (qp($url, 'entry') as $result) {
  $title = $result->children('content')->text();
  $img = $result->siblings('link[rel="image"]')->attr('href');
  $author = $result->parent()->find('author>name')->text();
  $out->append("<li><img src='$img'/> <em>$author</em><br/>$title</li>");
}
$out->writeHTML();
?>

Caso fosse executar o código acima usando um navegador da Web, veria algo como a Figura 3.

Figura 3. QueryPath Exibe Resultados da Procura do Twitter
QueryPath Exibe Resultados da Procura do Twitter

O código da Lista 16 tem 14 linhas de comprimento e o trabalho é feito somente em nove linhas. Como esse código foi convertido na visualização da Figura 3?

A variável $url contém a URL do Twitter examinada anteriormente. A variável $out aponta para o objeto QueryPath que será usado para gravar HTML no cliente. Iniciando com um documento básico (QueryPath::HTML_STUB), anexe uma lista desordenada e (usando find()) selecione essa nova lista.

O loop foreach é a linha mais importante do script: foreach (qp($url, 'entry') as $result). Aqui, é criado um novo objeto QueryPath . Como uma URL é passada, QueryPath irá recuperar o documento Atom remoto e analisar os resultados. E, como entry do seletor é passado, QueryPath selecionará todas as entradas do documento. Consulte a Lista 15 para ter uma ideia de qual parte do documento é esta. Haverá cinco entradas no documento retornado (já que é assim que o sinalizador rpp é configurado na URL). Cada uma das cinco entradas deve ter a aparência de <entry/> na Lista 15.

Dentro do loop, três dados são buscados:

$titleConteúdo da entrada
$imgURL para uma imagem de perfil para o usuário que efetuou a postagem
$authorNome do usuário que efetuou a postagem

Para recuperar cada bit dos dados, diversos métodos QueryPath são implementados. Por exemplo, é possível obter $title com $result->children('content')->text();.

Acessando Conteúdo com text(), html() e xml()

Você viu como text() poderia ser usado para configurar texto (Lista 1). Na Lista 16, o mesmo método é usado para recuperar informações. A função text() retornará todo o conteúdo do texto, mas não incluirá elementos nem outros tipos de nós. Caso queira obter todo o conteúdo, use xml() ou, para documento HTML, html().

Isso primeiro seleciona todos os filhos com o nome de tag content, em seguida, obtém o texto CDATA dos nós localizados. Cada entrada terá um elemento <content/> .

Agora, é necessário obter a URL da imagem. Na cadeia anterior, o elemento <content/> foi selecionado, portanto, esse é o ponto de partida. É necessário procurar nos irmãos de <content/> um elemento semelhante a <link rel="image"/>. Para fazer isso, use a função siblings() com um seletor. Em seguida, use a função attr() para obter o valor do atributo href do elemento.

Por fim, obtenha o nome do autor indo do elemento <link/> de volta para seu pai e, em seguida, use find('author>name'). (Consulte a Tabela 2 para saber como isso funciona.) A partir de lá, é possível obter o texto do nome do autor usando text().

No final de cada iteração do loop foreach , constrói-se um fragmento de HTML e usa-se append() para inseri-lo no QueryPath $out .

Após os resultados do Twitter terem sido iterados, é possível agrupar o script gravando o documento HTML no navegador: $out->writeHTML();.

Aí está. Em aproximadamente uma dúzia de linhas de código, foi feita a interface com um serviço da Web remoto. QueryPath pode ser usado dessa forma para acessar praticamente qualquer serviço da Web que use HTTP e XML ou HTML. Os exemplos fornecidos com QueryPath mostram como configurar parâmetros de conexão, executar consultas SPARQL em terminais SPARQL e analisar documentos complexos com diversos espaços de nomes. QueryPath fornece um excelente potencial para trabalhar com serviços da Web.


Conclusão

Neste artigo, você explorou o básico da biblioteca QueryPath. Aprendeu como criar objetos QueryPath , passar por documentos e manipular conteúdo. Também construiu um pequeno script de exemplo que funcionou com a API de serviços da Web do popular serviço de microblog Twitter.

Este artigo somente começou a explorar as possibilidades da biblioteca QueryPath. Por exemplo, apenas mencionou a API do banco de dados que pode ser usada para integrar o suporte a RDBMS à QueryPath. Imagine executar uma instrução SQL SELECT e fundir os resultados diretamente em uma tabela de HTML com marcações para suas especificações. Ou imagine construir um importador XML que analisou e inseriu os dados diretamente no banco de dados.

Há outros recursos de QueryPath que não foram mencionados. Com mapeadores e filtros, é possível fazer com que QueryPath execute funções customizadas para transformar ou filtrar dados de QueryPath. Com a extensão QPTPL , é possível fundir dados nos modelos de HTML puros predefinidos. QueryPath também suporta extensões definidas pelo usuário. Ao gravar uma definição de classe simples, é possível incluir seus próprios métodos em QueryPath.

Recursos

Aprender

  • QueryPath.org é o Web site oficial para o projeto QueryPath.
  • Documentação de QueryPath fornece documentação detalhadas da API, assim como exemplos, tutoriais e outros recursos.
  • Saiba mais sobre jQuery, a biblioteca de JavaScript que inspirou a QueryPath.
  • Leia a especificação de seletores CSS3 do W3C para aprender sobre a linguagem de consulta que a QueryPath suporta.
  • QueryPath também suporta consultas da Linguagem de Caminho XML do W3C XPath).
  • Leia sobre a API DOM (Document Object Model), que também é padronizada pelo W3C.
  • Twitter, um serviço para amigos, família e colegas de trabalho para comunicação e para manter contato, publica uma API de serviços da Web.
  • Siga QueryPath no Twitter para manter-se a par do desenvolvimento de QueryPath.
  • Matt Butcher posta notícias e artigos de QueryPath em seu blog TechnoSophos .
  • PHP.net é o recurso central para desenvolvedores de PHP.
  • Verifique a " Lista de Leitura Recomendada de PHP."
  • Navegue por todo o conteúdo de PHP no developerWorks.
  • Siga o developerWorks no Twitter.
  • Expanda suas qualificações em PHP verificando, no IBM developerWorks, Recursos de Projeto PHP.
  • Para ouvir entrevistas e discussões interessantes para desenvolvedores de software, verifique podcasts do developerWorks.
  • Usando um banco de dados com PHP? Verifique a Zend Core para IBM, um ambiente de desenvolvimento e produção de PHP pronto, transparente e de fácil instalação que suporta o IBM DB2 V9.
  • Fique atualizado com Eventos Técnicos e Webcasts do developerWorks.
  • Verifique as próximas conferências, convenções, webcasts e outros Eventos futuros no mundo que sejam de interesse de desenvolvedores de software livre da IBM.
  • Visite Zona de Software Livre do developerWorks para obter informações extensivas sobre como executar ações, sobre ferramentas e atualizações de projetos para ajudá-lo a se desenvolver com tecnologias de software livre e usá-las com produtos IBM.
  • Assista e aprenda sobre as tecnologias IBM e de software livre e funções de produtos gratuitamente com os Demos On Demand do developerWorks.

Obter produtos e tecnologias

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre
ArticleID=395946
ArticleTitle=Conheça a Biblioteca QueryPath PHP
publish-date=04282009