consultando documentos xml com xquery vânia maria ponte vidal [email protected]
TRANSCRIPT
Consultando Documentos XML com XQUERY
Vânia Maria Ponte [email protected]
Por que uma linguagem de Consulta para XML?
Consultar bases de dados XML tornou-se necessário dado que grandes quantidades de dados estão sendo armazenados utilizando XML.
Dados XML são diferentes dos dados de bancos de dados relacionais ou orientados a objetos pois os dados XML não seguem uma estrutura rígida.
Devido a flexibilidade da XML, linguagens de consultas convencionais não são adequadas para especificar consultas em documentos XML
Linguagens de Consulta para XML
LOREL: foi projetada inicialmente para consultar dados semi-estruturados e recentemente foi estendida para manipulação de dados XML. É uma linguagem baseada em OQL.
XML-QL: estende linguagem SQL com uma cláusula explícita CONSTRUCT que permite a construção de documentos como resultado de consulta
XML-GL: linguagem de consulta gráfica que tem como base uma representação em grafos de documentos XML e DTDs
Linguagens de Consulta para XML
XSL (Extensible Stylesheet Language): utiliza a linguagem XPath para selecionar os elementos a serem processados e para geração de textos
XQL: pode ser considerada uma extensão da sintaxe da XSL e foi projetada com o objetivo de ser sintaticamente mais simples e compacta, entretanto com o poder de expressão reduzido
XQuery XML Query Language Proposta pela W3C e agrega características de
diversas outras linguagens de consulta para XML, bem como SQL e OQL
É uma linguagem funcional na qual a consulta é representada como uma expressão
Utiliza o conceito de expressões de caminho para navegar em árvores
Xquery é flexível o suficiente para consultar vários tipos de fontes de informação XML incluindo bancos de dados e documentos
XQuery - ConceitosUma consulta em XQuery é uma expressão
que: Lê um número de documentos XML ou
fragmentos de documentos XML Retorna uma seqüência de fragmentos XML
bem-formadosExpressões XQuery podem ser:
Expressões de caminho Construtores de elementos Expressões FLWR Expressões condicionais Expressões com quantificadores
XQuery – Expressões de Caminho
Consiste de uma série de passos. Cada passo pode aplicar um ou mais predicados para
eliminar nós que não satisfazem uma determinada condição
Uma expressão de caminho pode começar com uma expressão que identifica um nó específico, como a função document (string), que retorna o nó raiz de um dado documento
Uma expressão de caminho também pode começar com “/” ou “//”, que representa um nó raiz implícito, determinado pelo ambiente no qual a consulta está sendo executada.
Expressões de Caminho - Exemplo
document(“livro.xml”) / doc // figura[titulo= “Fig1”]
Q1: Obtenha todas as figuras cujo título é “Fig1”
A função document lê um arquivo XML e retorna o nó raiz do documento
procura um elemento figura em qualquer profundidade depois do elemento doc
doccapitulo *
parte *figura
titulonumero
Expressões FLWR
FOR e LET: associam valores a uma ou mais variáveis WHERE: expressão condicional RESULT: retorna o resultado
FLWR = FOR-LET-WHERE-RETURN
Consiste de uma seqüência de um ou mais cláusulas FOR e/ou LET, seguidas por um WHERE opcional e terminada por um RETURN
Expressões FLWR - Exemplo
FOR $l IN document(“livraria.xml”)//livro[autor/pri_nome = “José”] RETURN $l/titulo
Q2: Obtenha os títulos dos livros cujo primeiro nome do autor é “José”
livrarialivros
livro*autor
pri_nomesobrenome
titulo
FOR $l IN document(“livraria.xml”)//livro WHERE $l/autor/pri_nome = “José” RETURN $l/titulo
Construção de ElementosQ3:Gerar documento XML cuja raiz é o elemento livros o
qual contém todos os títulos dos livros cujo autor tem como primeiro nome “José”
<livros> { FOR $l IN document(“livraria.xml”)//livro
WHERE $l/autor/pri_nome = “José” RETURN $l/titulo
}</livros> constrói um elemento livros
FLWR - ExemploQ4: Obter o ano e o título de todos os livros publicados pela editora Addison-Wesley depois de 1991.
livro*livraria
tituloanoautor+
pri_nomesobrenome
editor+
associação
editora
pri_nomesobrenome
preço
<livraria> { FOR $l IN document(doc.xml)/livraria/livro WHERE $l/editora = “Addison-Wesley” and $l/@ano > 1991 RETURN <livro ano=“{$livro/@ano}”> {$l/titulo} </livro> }</livraria>
@ é utilizado para acessar o valor do atributo
Expressão de caminho
FLWR - ExemploQ5: Criar elemento resultado contendo conjunto de elementos
livroWesley (os livros publicados pela Addison-Wesley ), o qual contém o título e autor do livro.
<resultado> { FOR $l in document(“doc.xml")/livraria/livro, WHERE $l/editora = “Addison-Wesley” RETURN < livroWesley > {($l/titulo, $l/autor )} </livroWesley > } </resultado>
livro*livraria
tituloanoautor+
pri_nomesobrenome
editor+
associaçãoeditora
pri_nomesobrenome
preço
FLWR - Exemplo
livro1.xml <listaSeções> { FOR $s in document(“livro1.xml")//seção RETURN <seção titulo="{ $s/titulo/text() }" figcont="{ count($s/figura )}”/> } </listaSeções >
retorna apenas o conteúdo do elemento (sem as tags)
Q6: criar elemento listaSeções o qual contém, para cada elemento seção de livro1.xml, um elemento seção contendo dois atributos título e figcont cujo valor é o número de figuras contidas na seção.
livro
caminho
@dificuldade@id
seção +autortitulo
titulofigura *
titulo
Ordenando Algumas vezes é necessário controlar a
ordem dos elementos na sequência Uma seqüência pode ser ordenada
utilizando a cláusula SORTBY, que pode conter uma ou mais expressões ordenadas
Cada expressão ordenada pode vir seguida de uma palavra chave Ascending (default) descending
Ordenando - ExemploQ7: Obtenha o título e o ano de todos os livros publicados pela
editora Addison-Wesley depois de 1991 e em ordem alfabética
livro*livraria
tituloanoautor+
pri_nomesobrenome
editor+
associação
editora
pri_nomesobrenome
preço
<livraria> { FOR $l IN document(doc.xml)/livraria/livro WHERE $l/editora = “Addison-Wesley” and $l/@ano > 1991 RETURN <livro ano=“{$livro/@ano}”> {$l/titulo} </livro> SORT BY (titulo) }</livraria>
Expressões Condicionais XQuery suporta expressões condicionais
baseadas em if, then, else Expressões condicionais são úteis
quando a estrutura da informação a ser retornada depende de alguma condição
As expressões condicionais podem ser aninhadas e podem ser usadas em qualquer lugar onde um valor é esperado
Expressões Condicionais - Exemplo
<livros> { FOR $l IN document(“Livraria.xml”)//livro RETURN <livro> { ($l/titulo, FOR $a in $l/autor[position( )<= 2] RETURN $a , IF (count($l/autor) >2) THEN <outros/> ELSE ( ))} </livro> }</livros>
expressão condicional
Retorna a posição do elemento
elemento vazio
Q8: Gerar elemento contendo o título e os dois primeiros autores dos livros. Se o livro tem outros autores então acrescentar o elemento vazio <outros/>
livro*livraria
tituloanoautor+
pri_nomesobrenome
editor+
associação
editora
pri_nomesobrenome
preço
Expressões com Quantificadores
Ocasionalmente é necessário testar se algum elemento ou todos elementos de uma coleção satisfaz uma condição
Para isso utilizamos o quantificador existencial (some) e o quantificador universal (every)
Expressões com Quantificadores
<resultado> {FOR $a IN distinctvalues(document(“livraria.xml”)//autor) RETURN <autor> {($a, <livrosDoAutor> {FOR $l IN document(“livraria.xml”)/livraria/livro WHERE some $la IN $l/autor satisfies deep-equal($la,$a) RETURN $l/titulo) } <livrosDoAutor> } </autor> </resultado>
deep-equal( ) testa se dois nós tem a mesma estrutura e os mesmos valores
Retorna somente valores distintos
Q9: Gerar elemento contendo para cada autor, o nome e os títulos de todos os livros do autor. Estes últimos, devem estar agrupados dentro de um elemento livrosDoAutor.
livro*livraria
tituloanoautor+
pri_nomesobrenome
editor+
associaçãoeditora
pri_nomesobrenome
preço
Expressões com Quantificadores
Q10 :Obtenha os títulos dos livros que tem “ótimo” em todos os comentários
<resultado> {for $l in //livro where every $c in $l/comentario contains($c, “ótimo”) return $l/titulo }</resultado>
quantificador universal
livrotituloautor
pri_nomesobrenome
comentario *
livraria
FunçõesFunções pré-definidas que podemos utilizar nas consultas XQuery (Xpath)
concat Concatena duas ou mais stringsstarts-with Indica se o valor de uma string começa com o
caracter do valor da outra stringends-with Indica se o valor de uma string termina com o
caracter do valor da outra stringcontains Indica se o valor de uma string contém
caracteres iguais ao valor da outra stringstring-length Retorna o tamanho da stringsubstring –before
Retorna os caracteres de uma string que precedem os caracteres que são iguais aos outra string
substring – after
Retorna os caracteres de uma string que que vem depois dos caracteres que são iguais aos outra string
Funções - ExemploPara cada livro contendo algum elemento cuja “label” termina com a string “or” e cujo conteúdo contém a string “José”, faça: - Retorne o título do livro e o elemento encontrado
for $l in document(“www.bn.com/livraria.xml”)//livrolet $e:= $l/* [contains(string(.),”José”) and ends-with(local-name(.),”or”)]where exists($e)return <book> { $l/titulo } { $e } </book>
* pega qualquer sub-elemento
Indica que é o nome do elemento e não o conteúdo do elemento
Procura a string no nó atual
Q11:
livro*livraria
tituloanoautor+
pri_nomesobrenome
editor+
associaçãoeditora
pri_nomesobrenome
preço
Funções - Exemplo
livro
caminho
@dificuldade@id
seção +autortitulo
titulofigura *
titulo
seção *
Liste todos os elementos seção preservando seus atributos e hierarquia. Dentro de cada seção coloque o título da seção e um elemento com o número de figuras contidos imediatamente naquela seção define function resumo_seção(element $s)
returns element { <section> { ($s/@* , $s/title , <numfig>{ count($s/figura) }</numfig> , for $ss in $s/seção return resumo_seção($ss) )} </section> }------------------------------------------------------------------ <resultado> { for $s in document(“livro.xml")/livro/seção return resumo_seção($s)} </resultado>
* Obtém todos os atributos de seção
Q12:
XQueryUma consulta em XQuery é uma expressão que:
Lê um número de documentos XML ou fragmentos de documentos XML
Retorna uma seqüência de fragmentos XML bem-formados
Expressões XQuery podem ser: Expressões de caminho Construtores de elementos Expressões FLWR Expressões condicionais Expressões com quantificadores
ESTUDO DE CASO I
@ISBN titulo editora preço
autor
Steven Holzner
[email protected] [email protected]
nome
livro
email nome
autor
livraria
1234 Inside XML
New Riders
100,00
Elemento Raiz
autorautor
[email protected] [email protected]
(*) Vide XML Schema em arquivo separado
XQuery
<livroXML> {FOR $q IN document(“liv.xml” ) / livraria / livro[titulo =“Inside XML”] RETURN <livro> { ($q/@ISBN,$q/titulo,$q/editora) } </livro> } </ livroXML >
Expressões FLWR – Exemplo (1)
- Obtenha ISBN, título e editora do livro cujo título é “Inside XML”.
XQuery
<livrosSteven> { FOR $q IN document("Livraria.xml")/livraria/livro LET $p := document("Livraria.xml")/livraria/autor[nome="Steven"] WHERE $q/autor = $p/email RETURN $q/titulo }</livrosSteven>
Expressões FLWR – Exemplo (2)
- Obtenha o titulo dos livros de autoria de Steven.