Você está na página 1de 48

XPath

Vanessa Braganholo

Curso baseado em mini-cursos apresentados no SBBD. Autores: Carlos Heuser, Carina Dorneles e Vanessa Braganholo

XPath

Especificao: http://www.w3.org/TR/xpath Uma expresso XPath seleciona um conjunto de nodos Operadores principais:

/ para dar um passo na rvore XML (percorrer uma relao pai-filho) // para dar vrios passos de uma vez (percorrer uma relao ascendente-descendente)

Exemplo

/empregados/empregado

<? xml version=1.0 ?> <empregados> <empregado cod=E01 dept=D01> <nome>Joo</nome> <inicial-meio>S.</inicial-meio> <sobrenome>Santos</sobrenome> </empregado> <empregado cod=E02 dept=D01> <nome>Ana</nome> <sobrenome>Ferraz</sobrenome> </empregado> </empregados>
3

Contexto

Cada / muda o contexto atual da consulta: /empregados


<? xml version=1.0 ?> <empregados> <empregado cod=E01 dept=D01> <nome>Joo</nome> <inicial-meio>S.</inicial-meio> <sobrenome>Santos</sobrenome> </empregado> <empregado cod=E02 dept=D01> <nome>Ana</nome> <sobrenome>Ferraz</sobrenome> </empregado> </empregados>
4

Contexto

Cada / muda o contexto atual da consulta: /empregados/empregado


<? xml version=1.0 ?> <empregados> <empregado cod=E01 dept=D01> <nome>Joo</nome> <inicial-meio>S.</inicial-meio> <sobrenome>Santos</sobrenome> </empregado> <empregado cod=E02 dept=D01> <nome>Ana</nome> <sobrenome>Ferraz</sobrenome> </empregado> </empregados>
5

como uma rvore de diretrios...

C:\Arquivo>cd Artigos C:\Arquivo\Artigos>cd aceitos C:\Arquivo\Artigos\aceitos>cd .. C:\Arquivo\Artigos>cd \ C:\>

Retorno da Expresso

Conjunto de nodos retornados sempre o especificado pelo ltimo passo do caminho /empregados/empregado/nome
<? xml version=1.0 ?> <empregados> <empregado cod=E01 dept=D01> <nome>Joo</nome> <inicial-meio>S.</inicial-meio> <sobrenome>Santos</sobrenome> </empregado> <empregado cod=E02 dept=D01> <nome>Ana</nome> <sobrenome>Ferraz</sobrenome> </empregado> </empregados>
7

Operador //

Retorna os descendentes a partir do contexto atual /empregados//nome //sobrenome


<? xml version=1.0 ?> <empregados> <empregado cod=E01 dept=D01> <nome>Joo</nome> <inicial-meio>S.</inicial-meio> <sobrenome>Santos</sobrenome> </empregado> <empregado cod=E02 dept=D01> <nome>Ana</nome> <sobrenome>Ferraz</sobrenome> </empregado> </empregados>

<? xml version=1.0 ?> <empregados> <empregado cod=E01 dept=D01> <nome>Joo</nome> <inicial-meio>S.</inicial-meio> <sobrenome>Santos</sobrenome> </empregado> <empregado cod=E02 dept=D01> <nome>Ana</nome> <sobrenome>Ferraz</sobrenome> </empregado> </empregados>
8

Atributos

Usa-se @ na frente do nome do atributo /empregados/empregado/@cod


<? xml version=1.0 ?> <empregados> <empregado cod=E01 dept=D01> <nome>Joo</nome> <inicial-meio>S.</inicial-meio> <sobrenome>Santos</sobrenome> </empregado> <empregado cod=E02 dept=D01> <nome>Ana</nome> <sobrenome>Ferraz</sobrenome> </empregado> </empregados>
9

Operador .

Seleciona o elemento corrente

Equivalentes!

/empregados/. /empregados

til para uso dentro de funes

<? xml version=1.0 ?> <empregados> <empregado cod=E01 dept=D01> <nome>Joo</nome> <inicial-meio>S.</inicial-meio> <sobrenome>Santos</sobrenome> </empregado> <empregado cod=E02 dept=D01> <nome>Ana</nome> <sobrenome>Ferraz</sobrenome> </empregado> </empregados>

10

Operador ..

Seleciona o pai do contexto atual /empregados/empregado/..


<? xml version=1.0 ?> <empregados> <empregado cod=E01 dept=D01> <nome>Joo</nome> <inicial-meio>S.</inicial-meio> <sobrenome>Santos</sobrenome> </empregado> <empregado cod=E02 dept=D01> <nome>Ana</nome> <sobrenome>Ferraz</sobrenome> </empregado> </empregados>

11

Operador *
Substitui um passo do caminho //empregado/*

<? xml version=1.0 ?> <empregados> <empregado cod=E01 dept=D01> <nome>Joo</nome> <inicial-meio>S.</inicial-meio> <sobrenome>Santos</sobrenome> </empregado> <empregado cod=E02 dept=D01> <nome>Ana</nome> <sobrenome>Ferraz</sobrenome> </empregado> </empregados>

12

XPath na prtica...

Arquivo: artigo.xml

Disponvel na pgina da disciplina

----------------------------------- XML Exchanger Lite

Abrir o arquivo XML a ser consultado, digitar a expresso XPath e apertar a seta verde.

XPath Visualizer

Disponvel em http://www.topxml.com/xpathvisualizer/

XML LITE

XPath Visualizer s funciona no Internet Explorer

Exerccio 1

Usando o documento XML fornecido, crie expresses XPath para as seguintes consultas:
a)

b)
c)

d) e)

f)

Selecionar as instituies dos autores do artigo Selecionar todos os pargrafos das sees do artigo Selecionar nomes dos autores do artigo propriamente dito e das referencias bibliogrficas Selecionar pai do elemento endereco Selecionar av do elemento paragrafo Selecionar todas as ocorrncias de endereo

Filtros

Restringem o conjunto de nodos selecionados Podem ser colocados em qualquer passo do caminho

17

Filtros

Sintaxe: Expresso booleana entre colchetes //empregado[@cod=E01]


<? xml version=1.0 ?> <empregados> <empregado cod=E01 dept=D01> <nome>Joo</nome> <inicial-meio>S.</inicial-meio> <sobrenome>Santos</sobrenome> </empregado> <empregado cod=E02 dept=D01> <nome>Ana</nome> <sobrenome>Ferraz</sobrenome> </empregado> </empregados>

18

Contexto do Filtro

Sempre o ltimo passo percorrido antes do filtro Retorno nunca o que est no filtro, mas o ltimo passo do caminho da expresso
<? xml version=1.0 ?> <empregados> <empregado cod=E01 dept=D01> <nome>Joo</nome> <inicial-meio>S.</inicial-meio> <sobrenome>Santos</sobrenome> </empregado> <empregado cod=E02 dept=D01> <nome>Ana</nome> <sobrenome>Ferraz</sobrenome> </empregado> </empregados>

//empregado[nome=Ana]

19

Filtro de Posio
//empregado[1]

<? xml version=1.0 ?> <empregados> <empregado cod=E01 dept=D01> <nome>Joo</nome> <inicial-meio>S.</inicial-meio> <sobrenome>Santos</sobrenome> </empregado> <empregado cod=E02 dept=D01> <nome>Ana</nome> <sobrenome>Ferraz</sobrenome> </empregado> </empregados>

20

Filtro de Posio
//nome[1]

ATENO: o filtro de posio leva em conta o pai do n como contexto, por isso neste exemplo ele retorna os dois elementos nome, e no apenas o primeiro que aparece no documento

<? xml version=1.0 ?> <empregados> <empregado cod=E01 dept=D01> <nome>Joo</nome> <inicial-meio>S.</inicial-meio> <sobrenome>Santos</sobrenome> </empregado> <empregado cod=E02 dept=D01> <nome>Ana</nome> <sobrenome>Ferraz</sobrenome> </empregado> </empregados>

21

AND, OR e NOT so aceitos


//empregado[@dept=D01 and nome=Joo]/sobrenome
<? xml version=1.0 ?> <empregados> <empregado cod=E01 dept=D01> <nome>Joo</nome> <inicial-meio>S.</inicial-meio> <sobrenome>Santos</sobrenome> </empregado> <empregado cod=E02 dept=D01> <nome>Ana</nome> <sobrenome>Ferraz</sobrenome> </empregado> </empregados>

ATENO: a ferramenta XML Exchanger Lite s aceita and e or minsculos

22

Testes de elementos

O nome de um elemento pode aparecer representando um elemento que deve estar presente como um filho

Selecionar um elemento empregado se ele contm um sub-elemento inicial-meio: //empregado[inicial-meio]


<? xml version=1.0 ?> <empregados> <empregado cod=E01 dept=D01> <nome>Joo</nome> <inicial-meio>S.</inicial-meio> <sobrenome>Santos</sobrenome> </empregado> <empregado cod=E02 dept=D01> <nome>Ana</nome> <sobrenome>Ferraz</sobrenome> </empregado> </empregados>

Exerccio 2
a)

b)

c)

d)

Selecionar o autor cujo nome Maria Ana Selecionar a obra da bibliografia cujo ano 1999 e o local University of Pennsylvania Selecionar a seo cujo nmero s2 e que contm um pargrafo cujo contedo ... Selecionar o atributo ttulo das sees

Funes

XPath possui muitas funes A maioria delas utilizada dentro dos filtros Uma lista completa est disponvel aqui: http://www.w3.org/TR/xpath#corelib

25

Testes de posio

Funo position() retorna a localizao sequencial do elemento testado

Selecionar somente o primeiro pargrafo dentre os j selecionados pelo padro

//empregado[position()=1] ou //empregado[1]

Testes de posio

Funo last() localiza o ltimo elemento (retorna o nmero da posio do ltimo elemento)

Selecionar o ltimo empregado //empregado[last()]

Funo count() retorna o nmero de ocorrncias de um elemento

Selecionar sees que contenham apenas dois pargrafos //secao[count(paragrafo)=2]

Funo NOT

Funo not() para reverter o resultado do teste

Selecionar todas as notas, exceto a terceira //nota[not(position()=3)] Selecionar uma nota que no contm um elemento ttulo //nota[not(titulo)] Selecionar todos os captulos, exceto aquele que tenha o atributo nmero com valor 10 //capitulo[not(@numero='10)]

Comparaes

Selecionar todos paragrafos, mas no o ltimo


//paragrafo[position()!=last()]

Outras comparaes:
//paragrafo[position()>2] //paragrafo[position()>=3] //paragrafo[position()>2 and position()<last()] //paragrafo[position()=2 or position() = 4]

Tratamento de Strings

Funo contains(par1, par2) retorna true se par1 contm o texto em par2 par1 pode ser text() ou .

Funo contains()

Usando "text()", testa somente o contedo textual do elemento

Selecionar titulo que contenha a palavra "relacional"

//titulo[contains(text(), "relacional")] <titulo>Modelo relacional</titulo>

Tratamento de Strings

Usando ".", testa o elemento secao e seus subelementos

Selecionar secao que contenha a palavra "relacional" em seu texto ou no texto de algum de seus descendentes

//secao[contains(., "relacional")]

<secao>Esta secao apresenta... <paragrafo>O modelo relacional ...</paragrafo> <paragrafo>Como j mencionado, ...</paragrafo> </secao>

Tratamento de Strings

Funo starts-with() testa o texto no comeo da string. No pode haver espao em branco.

Selecionar titulo que inicie com a palavra "Introduo"

//titulo[starts-with(., "Introduo")]

<titulo>Introduo a JSP</titulo> <titulo>_Introduo a JSP</titulo>

No funciona!

Tratamento de Strings

Funo string() converte o valor do argumento para string

Exemplo:

string(//capitulo[1]/@numero), retorna o valor do atributo numero do primeiro capitulo, em formato string

Funo normalize-space()

No meio da string, reduz vrios espaos em branco para um nico caractere espao Remove completamente os espaos do incio e fim da string

//titulo[contains(normalize-space(.), "Introduo a JSP")] <titulo> Introduo a JSP </titulo>

Tratamento de Strings

Funo concat() concatena strings. Pode ter um ou mais parmetros: concat(text1, texto2,..., texton)

Retornar a seo que fale da autora do livro

//secao[contains(.,concat (../autor/nome/text(), , ../autor/sobrenome/text()))] <livro> <autor> <nome>Ana</nome> <sobrenome>Silva</sobrenome> </autor> <secao> A autora Ana Silva ...</secao> <secao> ... </secao> </livro>

Tratamento de Strings

Funo translate() converte caracteres de acordo com um esquema de mapeamento.


Uso: comparaes case-insensitive Parmetros: string para converter, caracteres para modificar no texto fonte, e valores a serem colocados

//paragrafo[contains(translate(normalize-space(.), "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), "ELEMENTO")]

<paragrafo>EM XML, UM ELEMENTO ...</paragrafo> <paragrafo>Um documento XML deve possuir um elemento raiz ...</paragrafo>

os dois elementos paragrafo so recuperados

Tratamento de Nmeros

Operadores + e - podem ser usados:

//nota[3] equivalente a //nota[1 + 2]

Funo mod()

Fornece o resto de uma diviso truncada Selecionar pargrafos pares: //paragrafo[position() mod 2 = 0]

Filtros Mltiplos

Usados para combinar um teste de posio e um outro tipo de teste

Selecionar nomes de companhias, e ento extrair o terceiro nome da lista //nome[companhia][3]

... <nomes> <nome><pessoa>...</pessoa></nome> <nome><companhia>...</companhia></nome> <nome><companhia>...</companhia></nome> <nome><companhia>...</companhia></nome> <nome><companhia>...</companhia></nome> <nome><pessoa>...</pessoa></nome> </nomes> <nomes> <nome><pessoa>...</pessoa></nome> <nome><companhia>...</companhia></nome> <nome><pessoa>... </pessoa></nome> </nomes> ...

Filtros Mltiplos

Usados para combinar um teste de posio e um outro tipo de teste

Selecionar o terceiro nome, fornecendo o nome da companhia (s seleciona se for uma companhia!) //nome[3][companhia]

... <nomes> <nome><pessoa>...</pessoa></nome> <nome><companhia>...</companhia></nome> <nome><companhia>...</companhia></nome> <nome><companhia>...</companhia></nome> <nome><companhia>...</companhia></nome> <nome><pessoa>...</pessoa></nome> </nomes> <nomes> <nome><pessoa>...</pessoa></nome> <nome><companhia>...</companhia></nome> <nome><companhia>...</companhia></nome> <nome><pessoa>... </pessoa></nome> </nomes> ...

Outras funes

Comentrios:

Selecione comentrios que estejam dentro de livro

//livro/comment()

Instrues de processamento

Encontre instrues de processamento que estejam dentro do elemento livro

//livro/processing-instruction()

Exerccio 3

Usando o mesmo documento XML, crie expresses XPath (pode ser necessrio usar o resumo das funes XPath que est nos prximos slides)
a) b) c) d) e) f)

g)
h)

i)

Retorne todas as sees do artigo que possuem pelo menos um subelemento figura Selecione as sees mpares Selecione as sees mpares que possuem pelo menos um subelemento figura Selecione os pargrafos que contm uma instruo de processamento Encontre autores que possuam "Ana" no nome. No devem estar nas referencias bibliogrficas. A verso do artigo Selecione o pargrafo que tenha ambos os atributos "numero" e "tipo" Nome do(s) autor(res) da bibliografia cujo titulo da obra "Union Types for Semistructured Data ". Selecione o ano da publicao de bibliografias, cujo nome do autor contenha a palavra "Abiteboul"

Exerccio 3
j) k)

l)

m) n) o) p)

Um pargrafo cujo tamanho da string que ele contm 27 Selecione o terceiro pargrafo de uma seo Selecione um pargrafo que contenha o nome do segundo autor do artigo e sua instituio. Entre estes dois dados existe a string "from Selecione todo e qualquer pargrafo que tenha a string "two years". Trate o uso de maisculas e minsculas!! Selecionar sees que contenham somente dois pargrafos Selecione os elementos "ano" descendentes de bibliografia Encontre a instruo de processamento de algum elemento paragrafo.

Resumo das funes, XPath 1.0


Tabela baseada nas funes apresentadas na pgina da W3C

Funes para nodos (elementos)


Nome count() id() last() local-name() Sintaxe
count(node-set) = number id(value) = node-set last() = number local-name(node)= string

Descrio
Retorna o nmero de nodos de um node-set Seleciona elementos pelo seu ID nico Retorna o nmero da posio do ultimo nodo em uma lista de nodos processados Retorna a parte local de um nodo. Um nodo geralmente consiste de um prefixo, uma vrgula e seguida de um nome local Retorna o nome de um nodo Retorna a URI da namespace de um nodo especfico Retorna a posio em uma lista de nodos do nodo que est sendo processado

name() namespace-uri() position()

name(node) = string namespace-uri(node) = uri position() = number

Resumo das funes, XPath 1.0


Tabela baseada nas funes apresentadas na pgina da W3C

Funes para string


Nome
concat()

Sintaxe e Exemplo
string=concat(val1, val2, ..) Exemplo: concat('The',' ','XML') Resultado: 'The XML' bool=contains(val,substr) Exemplo: contains('XML','X') Resultado: true string=normalizespace(string) Exemplo: normalize-space(' The XML ') Resultado: 'The XML' bool=startswith(string,substr) Exemplo: starts-with('XML','X') Resultado: true string(value) Exemplo: string(314) Resultado: '314'

Descrio
Retorna a concatenao de todos os seus argumentos

contains()

Retorna true se a segunda string est contida na primeira

normalizespace()

Normaliza os espaos em broncos para um s

starts-with()

Retorna true se a primeira string inicia com a segunda

string()

Converte o valor do argumento para string

Resumo das funes, XPath 1.0


Tabela baseada nas funes apresentadas na pgina da W3C

Funes para string


Nome
stringlength() substring()

Sintaxe e Exemplo
number=string-length(string) Exemplo: string-length('Beatles') Resultado: 7 string=substring(string,start,length) Exemplo: substring('Beatles',1,4) Resultado: 'Beat' string=substring-after(string,substr) Exemplo: substring-after('12/10','/') Resultado: '10' string=substring-before(string,substr) Exemplo: substring-before('12/10','/') Resultado: '12' string=translate(value,string1,string2) Exemplo: translate('12:30','30','45') Resultado: '12:45' translate('12:30','03','54') Resultado: '12:45' translate('12:30','0123','abcd') Resultado: 'bc:da'

Descrio
Retorna o nmero de caracteres em uma string

Retorna a parted a string indicada nos argumentos

substringafter() substringbefore() translate()

Retorna a parte da string que est depois do argumento substr Retorna a parted a string que est antes do argumento substr Executa reposio character a character.

Resumo das funes, XPath 1.0


Tabela baseada nas funes apresentadas na pgina da W3C

Funes para numricos


Sintaxe e Exemplo ceiling(number) = number Exemplo: ceiling(3.14) Resultado: 4 floor(number) = number Exemplo: floor(3.14) Resultado: 3 number(value) = number Exemplo: number('100') Resultado: 100 round(number)= integer Exemplo: round(3.14) Resultado: 3 sum(nodeset)=number Exemplo: sum(/cd/price) Descrio Retorna o menor inteiro que no pe menor do que o argumento

Nome ceiling()

floor()

Retorna o maior inteiro que no maior do que o argumento

number()

Converte o valor do argumento para um numrico

round()

Arredonda o argumento ao inteiro mais prximo

sum()

Retorna o valor total de um conjunto numrico de valores em um node-set

Resumo das funes, XPath 1.0


Tabela baseada nas funes apresentadas na pgina da W3C

Funes booleanas
Nome boolean() false() Sintaxe e Exemplo bool=boolean(value) false() Exemplo: number(false()) Resultado: 0 bool=lang(language) bool=not(condition) Exemplo: not(false()) true() Exemplo: number(true()) Resultado: 1 Descrio Converte o argumento e retorna true ou false Retorna false

lang() not()

Retorna true se a linguagem do argumento casa com a linguagem do elemento xsl:lang Retorna true se a condio de argumento for falsa, e falsa se a condio for verdadeira Retorna true

true()

XPath e Java

Java tem um pacote para lidar com expresses XPath


javax.xml.xpath Documentao: http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/xpath/pa ckage-summary.html

Você também pode gostar