28
Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal [email protected]

Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal [email protected]

Embed Size (px)

Citation preview

Page 1: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

Consultando Documentos XML com XQUERY

Vânia Maria Ponte [email protected]

Page 2: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 3: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 4: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 5: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 6: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 7: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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.

Page 8: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 9: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 10: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 11: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 12: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 13: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 14: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 15: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 16: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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>

Page 17: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 18: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 19: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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)

Page 20: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 21: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 22: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 23: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 24: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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:

Page 25: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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

Page 26: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

ESTUDO DE CASO I

@ISBN titulo editora preço

autor

Steven Holzner

email

[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

Page 27: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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”.

Page 28: Consultando Documentos XML com XQUERY Vânia Maria Ponte Vidal vvidal@lia.ufc.br

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.