• Nenhum resultado encontrado

Linguagens de interrogação de dados XML - XPath. Gestão e Tratamento de Informação DEI IST

N/A
N/A
Protected

Academic year: 2021

Share "Linguagens de interrogação de dados XML - XPath. Gestão e Tratamento de Informação DEI IST"

Copied!
35
0
0

Texto

(1)

Linguagens de

interrogação de dados

XML - XPath

Gestão e Tratamento de Informação

DEI IST

(2)

Agenda

Introdução

Expressões de caminho (path expressions)

(3)

Porquê uma linguagem de

interrogação para dados SS?

Essencial para dados Web

Seleccionar partes de um documento

Interessante ter uma linguagem de

interrogação do tipo de BD para aplicar

predicados aos dados, e executar

(4)

Linguagens de

interrogação para

docum

e

ntos XML

LOREL e UnQL:

linguagens de consulta p/ dados semi-estruturados

XML-QL

: estende SQL

Strudel Project - AT&T Labs

XML-GL

: linguagem gráfica

Transforma o DTD e os documentos XML em

grafos

XSLT: conjunto de template rules – W3C

XQL: extensão

do XSL – Microsoft + W3C

(5)

Linguagem de

interrogação para dados

semi-estruturados

Poder expressivo

Capacidade de re-estruturação de dados SS

Semântica precisa

Composição

Saída de uma interrogação pode ser usada como entrada

noutra interrogação

Esquema

(6)

Expressões de caminho

(path expressions)

Seja l

1

.l

2

.l

3

…l

n

- sequência de etiquetas de arcos,

Expressão de caminho (path expression) - é uma

interrogação simples, cujo resultado é um conjunto de nós

de um dado grafo.

resultado de l

1

.l

2

.l

3

…l

n

sobre um grafo de dados

: é um conjunto

de nós v

n

tal que existem arestas (r,l

1

,v

1

), (v

1

,l

2

,v

2

),…,(v

n-1

, l

n

, v

n

)

no grafo de dados onde r é a raíz.

(7)

Exemplo

db book n1 n2 n3 biblio author author date title author date title paper Roux Combalusier 1976 Database Systems Smith 1999 Database Systems ... book

(8)

Exemplo

db book n1 n2 n3 biblio author author date title author date title paper Roux Combalusier 1976 Database Systems Smith 1999 Database Systems ...

biblio.book: {n1, n2}

book

(9)

Exemplo

db book n1 n2 n3 biblio author author date title author date title paper Roux Combalusier 1976 Database Systems Smith 1999 Database Systems ...

biblio.book.author: nós e conteúdo {“Roux”, “Combalusier”, “Smith”}

(10)

Expressões regulares

Sintaxe genérica:

e::= l |

| _ | e’.’e | ‘(‘e’)’ | e ’|’e | e’*’ | e’+’ |

e’?’ ,

Em que

l

varia entre as etiquetas,

e

sobre

expressões e

é o conjunto vazio.

Exemplo:

((s|S)ection|paragraph)(s)?

Corresponde a :

section, Section, sections, Sections, paragraph,

(11)

Outro exemplo

biblio._*.section.([tT]itle | paragraph.*heading)

Corresponde a qualquer caminho que começa com a

etiqueta biblio e acaba com uma etiqueta section,

seguido quer por um título (com possível primeira letra

maiúscula) ou uma aresta paragraph seguida por uma

aresta que contém a cadeia de caracteres heading.

A expressão regular _* corresponde a um número

(12)

Lacunas das path

expressions

Não constroiem nós novos

Não conseguem executar o equivalente a um

join

Não conseguem testar valores da base de

dados

(13)

XML Path Language

(XPath)

Recomendação W3C

Linguagem declarativa para especificar

caminhos nas árvores

Sintaxe semelhante à usada para caminhos

em hierarquias de ficheiros

Serve de base a outros standards do W3C:

XSL Transformations (XSLT)

XML Link (

XLink

)

(14)

Xpath: Definição

Uma

expressão XPath

,

p

, estabelece uma

relação entre:

Um nó de contexto e

Um nó que pertence ao conjunto de respostas

Exemplos:

author/firstname

.

= self

..

= parent

(15)

Exemplo

<bib>

<book> <publisher> Addison-Wesley </publisher> <author> Serge Abiteboul </author>

<author> <first-name> Rick </first-name> <last-name> Hull </last-name> </author>

<author> Victor Vianu </author>

<title> Foundations of Databases </title> <year> 1995 </year>

</book>

<book price=“55”>

<publisher> Freeman </publisher> <author> Jeffrey D. Ullman </author>

<title> Principles of Database and Knowledge Base Systems </title> <year> 1998 </year>

</book> </bib>

<bib>

<book> <publisher> Addison-Wesley </publisher> <author> Serge Abiteboul </author>

<author> <first-name> Rick </first-name> <last-name> Hull </last-name> </author>

<author> Victor Vianu </author>

<title> Foundations of Databases </title> <year> 1995 </year>

</book>

<book price=“55”>

<publisher> Freeman </publisher> <author> Jeffrey D. Ullman </author>

<title> Principles of Database and Knowledge Base Systems </title> <year> 1998 </year>

</book> </bib>

(16)

Modelo de dados para

XPath

bib

book book

publisher author

. . . .

Addison-Wesley Serge Abiteboul

A raíz

(17)

Expressão XPath

Pode ser:

-

Expressão absoluta

: começa com ‘/’, é seguida por uma

expressão relativa, e é avaliada começando pelo nó raiz

-

Expressão relativa

: sequência de passos de localização

separados por ‘/’.

Passo de localização

pode ser:

-

Vazio (//)

: procura todos os descendentes de cada nó no

contexto

-

NomeElemento [predicados]

: procura todos os elementos filho

de cada nó no contexto que têm o nome dado

-

@nomeAtributo [predicados] :

procura o nó atributo de cada nó

no contexto que tem o nome dado

(18)

Expressões simples

/bib/book/year

Resultado: <

year

> 1995 </

year

>

<

year

> 1998 </

year

>

/bib/paper/year

Resultado: empty (não existem artigos)

(19)

Expressões um pouco

mais complicadas

//author

Significado: todos os elementos autor que são

descendentes da raíz

Resultado:

<

author

> Serge Abiteboul </

author

>

<

author

> <

first-name

> Rick </

first-name

>

<

last-name

> Hull </

last-name

>

</

author

>

<

author

> Victor Vianu </

author

>

<

author

> Jeffrey D. Ullman </

author

>

/bib//first-name

Significado: “first-name” debaixo de “bib” a qualquer

(20)

Nós de texto

/bib/book/author/

text()

Significado: os textos debaixo de todos os autores

Resultado: Serge Abiteboul

Jeffrey D. Ullman

Rick Hull não aparece porque tem

firstname

,

lastname

Algumas funções em XPath:

text()

= retorna o valor textual

node()

= retorna qq. nó (= * or @* or

text()

)

(21)

Wildcard

//author/*

Resultado:

<

first-name

> Rick </

first-name

>

<

last-name

> Hull </

last-name

>

“*

“ Corresponde a qualquer elemento debaixo

de “autor” a qualquer profundidade

(22)

Nós atributo

/bib/book/@price

Resultado: “55”

@price

significa que price tem que ser um

atributo

(23)

Qualificadores (1)

/bib/book/author[first-name]

Significado: os elementos “author” que tenham

um “firstname”

Resultado:

<

author

> <

first-name

> Rick </

first-name

>

<

last-name

> Hull </

last-name

>

</

author

>

(24)

Qualificadores (2)

/bib/book/author[first-name][address[//zip][city]

]/lastname

Significado: os lastname dos “author” que tenham

“firstname” e cujo endereço contenha um “zip code”, a

qualquer profundidade, e uma cidade

Resultado: <

lastname

> … </

lastname

>

<

lastname

> … </

lastname

>

(25)

Qualificadores (3)

/bib/book[@price < “60”]

/bib/book[author/@age < “25”]

/bib/book[author/

text()

]

(26)

Sumário

bib

elemento

bib

*

qualquer elemento

/

root

/bib

bib

debaixo de

root

bib/paper

paper

debaixo de

bib

bib//paper

paper

bebaixo de

bib

, a qq profundidade

//paper

paper a qualquer profundidade

paper|book

um

paper

ou um

book

@price

atributo

price

bib/book/@price

atributo

price

em

book

, em

bib

db/book[@price]

books

que têm um atributo

price

(27)

A raíz

<

bib

> <

paper

> 1 </

paper

> <

paper

> 2 </

paper

>

</

bib

>

bib é o “document element”

A “root” está acima de bib

/bib

= retorna o elemento documento

/

= retorna a raíz

(28)

Exercício

Considere um documento XML d que representa uma colecção de CDs. Assuma que o documento é válido no que diz respeito à seguinte DTD:

<!ELEMENT CDlist ((CD)+)>

<!ELEMENT CD (composer, (performance)+, publisher, (length)?)>

<!ELEMENT performance (composition, (soloist)?, (orchestra, conductor)?)> <!ELEMENT composer (#PCDATA)>

<!ELEMENT publisher (#PCDATA)> <!ELEMENT length (#PCDATA)>

<!ELEMENT composition (#PCDATA)> <!ELEMENT soloist (#PCDATA)>

<!ELEMENT orchestra (#PCDATA)> <!ELEMENT conductor (#PCDATA)>

Quais as expressões XPath que retornam o seguinte de d, assumindo que o contexto inicial é o elemento CDlist:

 Todas as composições

 Todas as composições envolvendo um solista

 Todas as execuções com uma orquesta mas sem solista

 Todos os solistas que tocaram com a London Symphony Orchestra num CD

(29)

Todas as composições:

CD/performance/composition

Todas as composições envolvendo um solista:

CD/performance[soloist]/composition

Todas as execuções com uma orquestra mas sem

solista: CD/performance[orchestra and not(soloist)]

Todos os solistas que tocaram com a London Symphony

Orchestra num CD publicado pela Deutsche

Grammophon

CD[publisher="Deutsche Grammophon"]/performance

[orchestra="London Symphony Orchestra"]/soloist

Todos os CDs com execuções pela London Symphony

Orchestra

(30)

Navegação usando a sintaxe

completa

Passo de localização tem a sintaxe:

axis :: node-test predicates

Em que:

Axis

selecciona um conjunto de nós

candidatos

node-test

filtra os candidatos baseado no tipo

ou nome do nó

(31)

Navegação

Podemos navegar ao longo de 13 eixos:

ancestor

ancestor-or-self

attribute

child

descendant

descendant-or-self

following

following-sibling

namespace

parent

preceding

(32)

Exemplos

child::author/child:lastname

=

author/lastname

child::author/descendant::zip

=

author//zip

child::author/parent::*

=

author/..

child::author/attribute::age

=

author/@age

E os seguintes, o que querem dizer?

paper

/

publisher

/

parent

::*/

author

/

bib

//

address

[

ancestor

::

book

]

/

bib

//

author

/

ancestor

::*//

zip

(33)

Mais exemplos

name() = o nome do nó corrente

/

bib

//*[name()=

book

] é o mesmo que

/bib//book

O que quer dizer ?

/

bib

//*[

ancestor

::*[

name()

!=

book

]]

(34)

Sintaxe abreviada vs sintaxe

completa

Sintaxe completa Sintaxe abreviada

child::

nada (child eixo por omissão)

attribute::

@

/descendant::node() //

self::node() .

parent::node() ..

[position()=i]

[i]

Se o caminho começa com //, então o contexto inicial

(35)

Referências

Peter Wood, Slides on “Representing and Querying

Data on the Web”,

http://www.dcs.bbk.ac.uk/~ptw/teaching/data-on-the-web.html.

Dan Suciu, Slides on “The semistructured data model”,

CSE 590ds: Management of XML and Semistructured

Data,

http://www.cs.washington.edu/education/courses/cse5

90ds/01sp/

S. Abiteboul, P. Buneman, D. Suciu, “Data on the

Web, From Relations to Semistructured Data and

XML”, Morgan Kaufmann, 2000, (cap 4)

www.w3.org/TR/xpath

Recomendação W3C do XPath

www.w3schools.com/xpath

Tutorial XPath

Referências

Documentos relacionados