linguagens de interrogação de dados xml - xpath · funções sobre um cjto de nós ... ...

Post on 24-May-2018

215 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Linguagens de interrogação

de dados XML - XPath

Gestão e Tratamento de Informação

DEI IST – 2011/2012

Agenda

Introdução

Expressões de caminho (path expressions)

XPath

Porquê uma linguagem de

interrogação para dados Semi-Estrut.?

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 re-

estruturação dos dados

Linguagens de interrogação para

documentos 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

XQuery

….

Linguagem de interrogação para

dados semi-estruturados

Poder expressivo Capacidade de re-estruturação de dados Semi-Estuturados

Semântica precisa

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

Integração com esquemas Explorar a estrutura (se existir) para verificação de tipos

Manipulação em programas Interrogações podem ser geradas automaticamente

Expressões de caminho

(path expressions)

Seja l1.l2.l3…ln - 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 l1.l2.l3…ln sobre um grafo de dados: é um conjunto de

nós vn tal que existem arestas (r,l1,v1), (v1,l2,v2),…,(vn-1, ln, vn) no

grafo de dados onde r é a raíz.

resultado não é um conjunto de dados semi-estruturados.

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

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

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

book

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.

A expressão de exemplo:

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

Corresponde a :

section, Section, sections, Sections, paragraph, paragrahs

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

infinito de caminhos sempre que existe um ciclo.

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

=> Linguagem de interrogação é necessária

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 Query (Xquery)

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

part/*/*/subpart/../name = part/*/*[subpart]/name

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 Systems </title>

<year> 1998 </year>

</book>

</bib>

Modelo de dados para XPath

bib

book book

publisher author . . . .

Addison-Wesley Serge Abiteboul

A raíz

O elemento raíz

Expressão XPath

Uma 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

- Predicados: filtra os nós que são encontrados; compreendem: exps booleanas, exps numéricas, exps com um conjunto de nós, funções sobre um cjto de nós.

Expressões simples

/bib/book/year

Resultado: <year> 1995 </year>

<year> 1998 </year>

/bib/paper/year

Resultado: empty (não existem artigos)

XML

Expressões mais complexas

//author

Significado: todos os elementos autor que são descendentes da raíz, a qualquer profundidade

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 profundidade

Resultado: <first-name> Rick </first-name>

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())

name() retorna o nome da etiqueta corrente

Wildcard

//author/*

Resultado: <first-name> Rick </first-name>

<last-name> Hull </last-name>

“*“ Corresponde a qualquer elemento debaixo

de “autor” a qualquer profundidade

Nós atributo

/bib/book/@price

Resultado: “55”

@price significa que price tem que ser um

atributo

Qualificadores (1)

/bib/book/author[first-name]

Significado: os elementos “author” que tenham

um “first-name”

Resultado: <author> <first-name> Rick </first-name>

<last-name> Hull </last-name>

</author>

Qualificadores (2)

/bib/book/author[first-

name][address[//zip][city]]/lastname

Significado: os lastname dos “author” que tenham “first-

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

qualquer profundidade, e uma cidade

Resultado: <lastname> … </lastname>

<lastname> … </lastname>

Qualificadores (3)

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

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

/bib/book[author/text()]

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

db/book[@price=’10’] books com price igual a 10

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

Se tivermos comentários antes e depois de

<bib>, estes tornam-se irmãos de <bib>

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 publicado pela Deutsche Grammophon

Todos os CDs que têm execuções pela London Symphony Orchestra

Respostas

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

CD[performance[orchestra="London Symphony Orchestra"]]

Navegação usando a sintaxe completa

Passo de localização em Xpath tem a sintaxe:

axis :: node-test predicates

Em que:

Axis selecciona um conjunto de nós candidatos

node-test filtra os candidatos com tipo ou nome do nó

Os predicates são opcionais

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 preceding-sibling

self

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

Mais exemplos

name() = o nome do nó corrente

/bib//*[name()=book] é o mesmo que /bib//book

O que quer dizer ? /bib//*[ancestor::*[name()!=book]]

Os eixos de navegação dão-nos mais poder

Sintaxe abreviada vs sintaxe completa

Sintaxe completa Sintaxe abreviada

child:: nada (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 é a raíz.

Questões?

Gestão e Tratamento de Informação

DEI IST – 2011/2012

top related