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/