Linguagens de interrogação
de dados XML
XPath
Helena Galhardas
DEI IST
Agenda



Introdução
Expressões de caminho (path expressions)
XPath
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 reestruturaçã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
XSL: conjunto de template rules – W3C
XQL: extensão do XSL – Microsoft
....
XQuery
Linguagem de interrogação para
dados semi-estruturados

Poder expressivo



Semântica precisa
Composição


Saída de uma interrogação pode ser usada como entrada noutra
interrogação
Esquema


Capacidade de re-estruturação de dados SS
Explorar a estrutura (se existir) para verificação de tipos
Manipulação de programas

Interrogações podem ser geradas automaticamente logo convém
ser linguagem verbosa
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
para um dado grafo de nós.


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.
mas ainda não é um conjunto de dados semi-estruturados.
Exemplo
Roux
author
author
biblio
book
date
n1
db
title
Combalusier
1976
Database Systems
book
n2
paper
author
date
Smith
1999
title
n3
...
Database Systems
Exemplo
Roux
author
author
biblio
book
date
n1
db
title
Combalusier
1976
Database Systems
book
n2
paper
author
date
Smith
1999
title
n3
...
biblio.book: {n1, n2}
Database Systems
Exemplo
Roux
author
author
book
date
n1
Combalusier
1976
biblio
db
title
Database Systems
book
n2
author
paper
Smith
date
1999
title
n3
...
Database Systems
biblio.book.author: nós e conteúdo {“Roux”, “Combalusier”, “Smith”}
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,
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
Sintaxe básica (Lorel)
Select author: X
From biblio.book.author X
Resultado:
{author: “Roux”, author: “Combalusier”, author:
“Smith”}
Roux
author
author
q1
author
Combalusier
Smith
select row: X
from biblio._ X
where “Smith” in X.author
{row: {author: “Smith”,
date: 1999,
title: “Database Systems”,...}
n2
author
date
q2
Smith
1999
title
...
Database Systems
select author: Y 3º
from biblio._ X,
1º
X.author Y,
X.title Z
where matches(“.*(D|d)atabase.*”, Z)
2º
Resultado: todos os autores de publicações
cujo título contém a palavra “database”
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)
XML Pointer (XPointer)
XML Query
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 Base Systems </title>
<year> 1998 </year>
</book>
</bib>
Modelo de dados para XPath
A raíz
bib
book
publisher
Addison-Wesley
O elemento raíz
book
author
. . . .
Serge Abiteboul
Idêntico ao modelo de dados de
XQuery
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)
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
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
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>
Nós atributo
/bib/book/@price
Resultado: “55”
@price significa que price tem que ser um
atributo
Qualificadores (1)
/bib/book/author[firstname]
Significado: os elementos “author” que tenham
um “firstname”
Resultado: <author> <first-name> Rick </first-name>
<last-name> Hull </last-name>
</author>
Qualificadores (2)
/bib/book/author[firstname][address[//zip][city]]/last
name
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>
Qualificadores (3)
/bib/book[@price < “60”]
/bib/book[author/@age < “25”]
/bib/book[author/text()]
Sumário dos exemplos
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
/
= returna a raíz
Se tivermos comentários antes e depois de
<bib>, estes tornam-se irmãos de <bib>
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>
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





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"]]
Referências





Peter Wood, Slides on “Representing and Querying
Data on the Web”,
http://www.dcs.bbk.ac.uk/~ptw/teaching/data-on-theweb.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
Próximo tópico

XSLT
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ó
 E os predicates são opcionais

Navegação

Podemos navegar ao longo de 13 eixos:
ancestor
ancestor-or-self
Attribute – todos os atributos do nó de contexto
child
descendant
descendant-or-self
following
following-sibling
namespace
Parent – o pai do nó de contexto
preceding
preceding-sibling
self – o nó de contexto, ele mesmo
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
child::
attribute::
/descendant-or-self::node()/
self::node()
parent::node()
[position()=i]

Sintaxe abreviada
nada (child eixo por omissão)
@
//
.
..
[i]
Se o caminho começa com //, então o contexto inicial é a
raíz.
Download

bib