GERÊNCIA DE DADOS SEMI ESTRUTURADOS - XQUERY Prof. Angelo Augusto Frozza XQUERY (XML QUERY LANGUAGE) XQuery é para XML o que o SQL é para Banco de Dados. XQUERY (XML QUERY LANGUAGE) XQuery é uma linguagem para encontrar e extrair elementos e atributos de documentos XML. P.ex.: “Selecione todos os registros de livros com preço maior do que R$ 30,00, armazenados no documento books.xml, ordenado por titulo.” for $x in doc("books.xml")/bookstore/book where $x/price > 30 order by $x/title return $x/title XQUERY (XML QUERY LANGUAGE) XQuery 1.0 e Xpath 2.0 compartilham o mesmo modelo de dados e suportam as mesmas funções e operadores. XQuery pode ser usada para: Extrair informação para usar em um Web Service; Gerar relatórios resumidos; Transformar dados XML em XHTML; Procurar em documentos Web por informações relevantes. XQuery é um padrão W3C. XQUERY (XML QUERY LANGUAGE) Limitações da XPath recupera somente porções de um documento XML incapaz de produzir resultados mais elaborados de consulta combinação (junção) de dados XML geração de novas estruturas de dados XQuery recomendação recente da W3C (2007) maior poder de expressão que a XPath ESTRUTURA BÁSICA DE UMA CONSULTA Expressões FLWR (“flower”) (acrônimo de “for, Let, Where, Order by, Return”) for variável in expressão XPath [let associação de novas variáveis] [where condição] return estrutura de resultado Exemplo: for $liv in /livros/livro where $liv/autor/nome = "Maria Souza" return <livrosMariaSouza> { $liv/@ISBN, $liv/titulo } </livrosMariaSouza> ESTRUTURA BÁSICA DE UMA CONSULTA Resultado da consulta for $liv in /livros/livro where $liv/autor/nome = "Maria Souza" return <livrosMariaSouza> { $liv/@ISBN, $liv/titulo } </livrosMariaSouza> <livrosMariaSouza> <livro @ISBN = "114"> <titulo>Viagem à Serra</titulo> <livro @ISBN = "417"> <titulo>Tempo de Mudança</titulo> <livro @ISBN = "993"> <titulo>Auto-Biografia</titulo> </livrosMariaSouza> ESTRUTURA BÁSICA DE UMA CONSULTA Uso da cláusula let for $liv in /livros/livro let $pDesc := $liv/preco - $liv/preco * 0.1 where $liv/@tipo = "ficcao" return {$liv/titulo, $pDesc} Junções e ordenação do resultado for $liv1 in /livros/livro[@ISBN = "562"] for $liv2 in /livros/livro where $liv2/@ISBN != $liv1/@ISBN and $liv2/autor/nome = $liv1/autor/nome return $liv2/titulo sort by (. ascending) INICIANDO COM XQUERY Funções XQuery usa funções para extrair dados de documentos XML P.ex.: A função doc() é usada para abrir um documento XML doc("books.xml") Expressões de caminho XQuery usa expressões de caminho (XPath) para navegar através de elementos em um documento XML P.ex.: A seguinte expressão XPath é usada para selecionar todos os elementos title no arquivo books.xml doc("books.xml")/bookstore/book/title INICIANDO COM XQUERY Predicados XQuery usa predicados para limitar os dados extraídos de documentos XML P.ex.: O seguinte predicado é usado para selecionar todos os elementos book que tem um elemento price com valor menor do que R$ 30,00 doc("books.xml")/bookstore/book[price < 30] EXEMPLOS DE CONSULTA XQUERY Observe a seguinte expressão XPath doc("books.xml")/bookstore/book[price > 30]/title Irá selecionar todos os elementos title, sob os elementos book que estão sob o elemento bookstore, e que tem um elemento price com valor superior a R$ 30,00. A seguinte expressão FLWOR é equivalente for $x in doc("books.xml")/bookstore/book where $x/price > 30 return $x/title EXEMPLOS DE CONSULTA XQUERY Com expressões FLWOR é possível ordenar o resultado for $x in doc("books.xml")/bookstore/book where $x/price > 30 order by $x/title return $x/title EXEMPLOS DE CONSULTA XQUERY Expressões FLWOR A cláusula for seleciona todos os elementos book, sob o elemento bookstore, em uma variável chamada $x A cláusula where seleciona somente os elementos book com um elemento price com um valor maior que 30 A cláusula order by define a ordem de ordenação (elemento title) A cláusula return especifica o que deveria ser retornado (elementos title) EXEMPLOS DE CONSULTA XQUERY Apresentar o resultado em uma lista HTML Expressão XQuery FLWOR: for $x in doc("books.xml")/bookstore/book/title order by $x return $x Resultado em forma de lista HTML (<ul> ... <li>): <ul> { for $x in doc("books.xml")/bookstore/book/title order by $x return <li>{$x}</li> } </ul> EXEMPLOS DE CONSULTA XQUERY Apresentar o resultado em uma lista HTML Agora eliminamos o elemento title e mostramos somente os dados dentro do elemento title: <ul> { for $x in doc("books.xml")/bookstore/book/title order by $x return <li>{data($x)}</li> } </ul> TERMINOLOGIA XQUERY XQuery usa a mesma terminologia do XPath Nodos Elementos, atributos, text, namespace, instruções de processamento, comentários e nodos documento (raiz) Exemplos: <bookstore> (nodo documento - raiz) <author> J K. Rowling</author> lang = “en” (nodo atributo) Valores atômicos São nodos sem filhos ou pais Exemplos: J K. Rowling “en” (nodo elemento) TERMINOLOGIA XQUERY XQuery usa a mesma terminologia do XPath Items São valores atômicos ou nodos Relacionamento de nodos Pai Filho Irmão Ancestral (Avô) Descendentes TERMINOLOGIA XQUERY Regras básicas de sintaxe XQuery É case-sensitive Elementos, atributos e variáveis devem ser nomes XML válidos Um valor string pode estar entre aspas simples ou dupla Uma variável XQuery é definida com $ seguido por um nome. P.ex.: $bookstore Comentários são delimitados por (: e :) P.ex.: (: XQuery Comment :) TERMINOLOGIA XQUERY Expressões condicionais em XQuery Expressões If-Then-Else são permitidas em XQuery for $x in doc("books.xml")/bookstore/book return if ($x/@category="CHILDREN") then <child>{data($x/title)}</child> else <adult>{data($x/title)}</adult> É necessário colocar os parênteses na expressão de teste do if A cláusula else é obrigatória, mas pode ser substituída por else() RESULTADO: <adult>Everyday Italian</adult> <child>Harry Potter</child> <adult>Learning XML</adult> <adult>XQuery Kick Start</adult> TERMINOLOGIA XQUERY Comparações em Xquery Há dois modos de comparar valores: Comparações gerais: =, !=, <, <=, >, >= Comparação de valores: eq, ne, lt, le, gt, ge Diferença entre os dois métodos de comparação A seguinte expressão retorna Verdadeiro se qualquer atributo q tem um valor maior que 10 $bookstore//book/@q > 10 A seguinte expressão retorna Verdadeiro se há somente UM atributo q retornado pela expressão e se este é maior do que 10. Se retornar mais de um atributo q, ocorre um ERRO. $bookstore//book/@q gt 10 XQUERY – ADICIONANDO ELEMENTOS E ATRIBUTOS Adicionando Elementos e Atributos para o resultado <html> <body> <h1>Bookstore</h1> <ul> { for $x in doc("BookStore.xml")/bookstore/book order by $x/title return <li>{data($x/title)}. Category: {data($x/@category)}</li> } </ul> </body> </html> XQUERY – ADICIONANDO ELEMENTOS E ATRIBUTOS Adicionando Atributos para elementos HTML <html> <body> <h1>Bookstore</h1> <ul> { for $x in doc("BookStore.xml")/bookstore/book order by $x/title return <li class="{data($x/@category)}"> {data($x/title)} </li> } </ul> </body> </html> XQUERY – SELECIONANDO E FILTRANDO ELEMENTOS Expressões FLWOR A cláusula for A cláusula for liga uma variável para cada item retornado pela expressão. A cláusula for resulta em interação. Pode haver múltiplas cláusulas for na mesma expressão FLWOR. for $x in (1 to 5) return <test>{$x}</test> for $x at $i in doc("books.xml")/bookstore/book/title return <book>{$i}. {data($x)}</book> for $x in (10,20), $y in (100,200) return <test>x={$x} and y={$y}</test> XQUERY – SELECIONANDO E FILTRANDO ELEMENTOS Expressões FLWOR A cláusula let A cláusula let permite atribuições de variáveis e evita repetir a mesma expressão muitas vezes. Esta cláusula não resulta em interação. let $x := (1 to 5) return <test>{$x}</test> XQUERY – SELECIONANDO E FILTRANDO ELEMENTOS Expressões FLWOR A cláusula where A cláusula where é usada para especificar um ou mais critérios para o resultado. where $x/price > 30 and $x/price < 100 XQUERY – SELECIONANDO E FILTRANDO ELEMENTOS Expressões FLWOR A cláusula order by A cláusula order by é usada para especificar a ordenação do resultado. for $x in doc("books.xml")/bookstore/book order by $x/@category, $x/title return $x/title XQUERY – SELECIONANDO E FILTRANDO ELEMENTOS Expressões FLWOR A cláusula return Especifica o que deve ser retornado. for $x in doc("books.xml")/bookstore/book return $x/title FUNÇÕES XQUERY XQuery inclui mais de 100 funções embutidas (built-in functions). Há funções para valores string e numéricos, comparação de data e hora, manipulação de nodos e QName, manipulação de sequência, valores booleanos, entre outras. Também é possível definir funções de usuário (userdefined functions). EXERCÍCIOS Encontre um arquivo de dados disponível na Internet. Pesquise dados XML no portal http://www.dados.gov.br ou Pesquise no Google por arquivos XML, eliminando da busca arquivos que representam mapa de sites P.ex.: filetype:xml -sitemap.xml produto Crie cinco consultas distintas em XQuery, conforme indicado abaixo: Uma consulta gerando como resultado um documento XML Uma consulta gerando como resultado um documento HTML Duas consultas utilizando diferentes funções built-in Uma consulta utilizando uma função definida pelo usuário REFERÊNCIA BIBLIOGRÁFICA XQuery Tutorial http://www.w3schools.com/xquery Portal Brasileiro de Dados Abertos http://www.dados.gov.br Portal de Dados Abertos de SP http://www.governoaberto.sp.gov.br/view/