1. XPath
ƒ O significado de um elemento pode depender de seu
contexto.
ƒ Navegação dentro do documento XML para encontrar este
contexto
ƒ Encontrar os elemento através de caminhos
ƒ Para chegar a um elemento:
9 Como em URL:
• Uso de caminho absoluto - Especificar toda a hierarquia de elementos de
uma árvore XML
• Uso de caminho relativo - Especificar, em qualquer ponto do caminho,
elementos relativos ao elemento contexto
ƒ Explorar a estrutura hierárquica do documento
2. XPath
ƒ Localizar com precisão um elemento de interesse
ƒ Exemplo: Obter o último nome do autor de um livro
<livro>
<autor>
<nome>
<primeiro>John</primeiro>
<ultimo>Smith</ultimo> --->> RESULTADO CORRETO
</nome>
</author> ...
<chapter>
<autor>
<nome>
<primeiro>John</primeiro>
<ultimo>Smith</ultimo> --->> RESULTADO INCORRETO
</nome>
</author>
</chapter>
</livro>
3. XPath
ƒ XPath usa expressões
9 Strings com símbolos significativos;
9 Identificar o elemento titulo que é filho direto de um
elemento livro:
livro/titulo String com símbolo
significativo "/"
4. É como uma árvore de diretórios...
C:Arquivo>cd Artigos
C:ArquivoArtigos>cd aceitos
C:ArquivoArtigosaceitos>cd ..
C:ArquivoArtigos>cd
C:>
5. XPath - Expressões
ƒ Expressão é uma string de texto que consiste de instruções
para selecionar alguma estrutura de marcação
ƒ Símbolos especiais:
"/", "*", ".", ".."
ƒ Expressão mais simples:
//livro
ƒ Expressões podem ser usadas para selecionar
9 atributos, comentários, instruções de processamento, ou seqüência
de texto entre elementos
ƒ São usadas em diferentes maneiras, para diferentes
propósitos.
6. Caminhos
ƒ Usado quando quer selecionar algo, independente
do contexto corrente
9 Para indicar a raiz do documento, usa-se "/"
/book/title
9 Selecionar ocorrências de um elemento cujos
antecessores não importam, usa-se "//"
//para
7. Caminhos
ƒ Quando os nomes de elementos entre o elemento
contexto e o descendente requerido não é
conhecido
9Ex: selecionar títulos de capítulos e da introdução
/livro/introducao/titulo e
/livro/capitulo/titulo
/livro/*/titulo
ƒ Múltiplos "*" podem ser usados para selecionar um
maior nível de profundidade
9 Um “*” para cada nível
8. Caminhos
ƒ Uma forma abreviada para os múltiplos "*" é //
9 seleciona todos os elementos paragrafo que ocorrem em
qualquer lugar de capitulo
/capitulo//paragrafo
ƒ Para selecionar todos os paragrafo diretamente
dentro do elemento corrente:
//paragrafo
ƒ Seleção do elemento corrente:
.
9. Exercício 1
Usando o documento XML fornecido, crie expressões
XPath para as seguintes consultas:
1. Selecionar as instituições dos autores do artigo
2. Selecionar todos os parágrafos das seções do artigo
3. Selecionar nomes dos autores do artigo propriamente
dito e das referencias bibliográficas
4. Selecionar pai do elemento endereco
5. Selecionar avô do elemento paragrafo
6. Selecionar todas as ocorrências de endereço
10. Filtros
ƒ Usados para remover itens indesejados de
uma lista para criar uma nova lista. Ex:
9Seleciona os parágrafos de todos os capítulos, no
entanto somente o primeiro parágrafo em cada
capítulo.
/book/chapter/para[1]
ƒ Usa "[", e "]", para manipular o predicado. Os
resultados do teste são um valor booleano, e
a seleção só ocorre quando o valor é true.
11. Testes de elementos e atributos
ƒ Elementos
9O nome de um elemento pode aparecer
representando um elemento que deve estar
presente como um filho
• Selecionar um elemento nota se ele contém
diretamente um elemento tituto : /nota[titulo]
9O valor de um elemento pode ser testado:
• Selecionar a nota cujo titulo seja "Inicial":
/nota[titulo="Inicial"]
12. Testes de elementos e atributos
ƒ Atributos
9podem ser selecionados dependendo do valor ou
da existência ou não de um atributo
9O símbolo @ é usado para representar um
atributo e precede o nome do atributo
• Selecionar o atributo autor do elemento livro:
/livro/@autor
• Seleciona todo parágrafo com o valor do atributo tipo
igual a ‘secreto’: /para[@tipo='secreto']
13. AND e OR
ƒ Como os filtros são expressões booleanas, pode-se
usar AND e OR
ƒ Exemplo:
//note[titulo=“A” and ano=2000]
Atenção: o XML Exchanger Lite só aceita and e or
minúsculos
14. Exercício 2
1. Selecionar o autor cujo nome é Maria Ana
2. Selecionar a obra da bibliografia cujo ano é 1999 e
o local é University of Pennsylvania
3. Selecionar a seção cujo número é s2 e que contém
um parágrafo cujo conteúdo é ...
4. Selecionar o atributo título das seções
15. Testes de posição
ƒ Função position() retorna a localização
sequencial do elemento testado
9Selecionar somente o primeiro parágrafo dentre
os já selecionados pelo padrão
/paragrafo[position()=1]
ou
/paragrafo[1]
16. Testes de posição
ƒ Função last() localiza o último elemento (retorna o
número da posição do último elemento)
9 Selecionar o último parágrafo
//paragrafo[last()]
ƒ Função count() retorna o número de ocorrências de
um elemento
9 Selecionar seções que contenham apenas dois
parágrafos
//secao[count(paragrafo)=2]
17. Função NOT
ƒ Função not() para reverter o resultado do
teste
9Selecionar todas as notas, exceto a terceira
//nota[not(position()=3)]
9Selecionar uma nota que não contém um
elemento título
//nota[not(titulo)]
9Selecionar todos os capítulos, exceto aquele que
tenha o atributo número com valor 10
//capitulo[not(@numero='10’)]
18. Comparações
ƒ Selecionar todos paragrafos, mas não o último
/paragrafo[position()!=last()]
ƒ Outras comparações:
/paragrafo[position()>2]
/paragrafo[position()>=3]
/paragrafo[position()>2 and position()<last()]
/paragrafo[position()=2 or position() = 4]
19. Tratamento de Strings
ƒ Função contains(par1, par2) retorna true se par1 contém
o texto em par2
par1 pode ser text() ou .
20. Função contains()
ƒ Usando "text()", testa somente o texto do elemento
9Selecionar titulo que contenha a palavra
"relacional"
//titulo[contains(text(), "relacional")]
<titulo>Modelo relacional</titulo>
21. Tratamento de Strings
ƒ Usando ".", testa o elemento secao e seus
subelementos
9 Selecionar secao que contenha a palavra "relacional"
//secao[contains(., "relacional")]
<secao>Esta secao apresenta...
<paragrafo>O modelo relacional ...</paragrafo>
<paragrafo>Como já mencionado, ...</paragrafo>
</secao>
22. Tratamento de Strings
ƒ Função starts-with() testa o texto no começo da
string. Não pode haver espaço em branco.
9 Selecionar titulo que inicie com a palavra "Introdução"
//titulo[starts-with(., "Introdução")]
<titulo>Introdução a JSP</titulo>
<titulo>_Introdução a JSP</titulo>
Não funciona!
23. Tratamento de Strings
ƒ Função string() converte o valor do argumento para string
9 Exemplo:
string(//capitulo[1]/@numero), retorna o valor do atributo numero do
primeiro capitulo, em formato string
ƒ Função normalize-space()
9 No meio da string, reduz vários espaços em branco para um único
caractere espaço
9 Remove completamente os espaços do início e fim da string
//titulo[contains(normalize-space(.), "Introdução a JSP")]
<titulo> Introdução a JSP </titulo>
24. Tratamento de Strings
ƒ Função concat() concatena strings. Pode ter um ou
mais parâmetros:
concat(text1, texto2,..., texton)
9 Retornar a seção 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>
25. Tratamento de Strings
ƒ Função translate() converte caracteres de acordo com um
esquema de mapeamento.
9 Uso: comparações case-insensitive
9 Parâmetros: string para converter, caracteres para modificar no texto
fonte, e valores a serem colocados
//paragrafo[contains(translate(normalize-space(.), "abcdefghijklmnopqrstuvwxyz",
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"), "ELEMENTO")]
O que está em minúsculo é
trocado pelo maiúsculo. O que
está em maiúsculo é comparado
normalmente
<paragrafo>EM XML, UM ELEMENTO É ...</paragrafo>
<paragrafo>Um documento XML deve possuir um elemento raiz ...</paragrafo>
9 os dois elementos paragrafo são recuperados
26. Tratamento de Strings
ƒ Função string-length() determina o número de
caracteres em uma string
//paragrafo[string-length(.)=15]
<paragrafo> quinze letras </paragrafo>
<paragrafo>123456789012345</paragrafo>
ƒ Função substring-before() extrai texto do início da
string
9 Parâmetros: a string de onde será extraído o texto, os
caracteres que terminam o prefixo a serem extraídos
//titulo[contains(.,substring-before(.,"*"))]
<titulo>Contrução dos arquivos *.gif</titulo>
27. Tratamento de Strings
ƒ Função substring-after() extrai texto do final da string
9 Parâmetros: a string de onde será extraído o texto, os caracteres que
terminam o prefixo a serem extraídos
//titulo[contains(.,substring-after(.,"*"))]
<titulo>Contrução dos arquivos *.gif</titulo>
ƒ Função substring() extrai qualquer fragmento de uma string
9 Parâmetros: a string fonte, posição de deslocamento, número de
caracteres a extrair
//paragrafo[substring(.,13,5)="XPath"]
5 caracteres
<paragrafo>A linguagem XPath</paragrafo>
---------13
<paragrafo>Este parágrafo com XPath não é recuperado</paragrafo>
28. Tratamento de Números
ƒ Função number() converte o valor do argumento
para números.
9 Expressões booleanas são interpretadas como:
• 1 para true
• 0 para false
29. Tratamento de Números
ƒ Operadores + e - podem ser usados:
9 //nota[3] é equivalente a /nota[1 + 2]
ƒ Função mod()
9 Fornece o resto de uma divisão truncada
9 Selecionar parágrafos pares:
//paragrafo[position() mod 2 = 0]
30. Filtros Múltiplos
ƒ Usados para combinar um teste de posição e um outro tipo de teste
9 Selecionar nomes de companhias, e então 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>
31. Filtros Múltiplos
ƒ Usados para combinar um teste de posição e um outro tipo de teste
9 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><pessoa>... </pessoa></nome>
</nomes>
32. Testes de boleanos
ƒ Função boolean() avalia uma expressão e retorna um valor
boleano. Se o argumento for:
9 Número: Retorna TRUE se for diferente de zero
boolean(3) --> TRUE
boolean(0) --> FALSE
9 Conjunto de nodos: Retorna TRUE se houver ao menos um nodo
boolean(title) --> TRUE
boolean() --> FALSE
9 String: Retorna TRUE se o tamanho da string for maior que zero
boolean("algum texto") --> TRUE
boolean("") --> FALSE
33. Outras funções
ƒ Comentários:
9 Selecione comentários que estejam dentro de livro
//livro/comment()
ƒ Instruções de processamento
9 Encontre instruções de processamento que estejam dentro
do elemento livro
//livro/processing-instruction()
34. Exercício 3
ƒ Usando o mesmo documento XML, crie expressões XPath
1. Retorne todas as seções do artigo que possuem pelo menos um
subelemento figura (use a função boolean)
2. Selecione as seções ímpares
3. Selecione as seções ímpares que possuem pelo menos um subelemento
figura
4. Selecione os parágrafos que contêm uma instrução de processamento
5. Encontre autores que possuam "Ana" no nome. Não devem estar nas
referencias bibliográficas.
6. A versão do artigo
7. Selecione o parágrafo que tenha ambos os atributos "numero" e "tipo"
8. Nome do(s) autor(res) da bibliografia cujo titulo da obra é "Union Types for
Semistructured Data ".
9. Selecione o ano da publicação de bibliografias, cujo nome do autor contenha
a palavra "Abiteboul"
35. Exercício 3
10. Um parágrafo cujo tamanho da string que ele contém é 27
11. Selecione o terceiro parágrafo de uma seção
12. Selecione um parágrafo que contenha o nome do segundo autor do artigo e
sua instituição. Entre estes dois dados existe a string "from“
13. Selecione todo e qualquer parágrafo que tenha a string "two years". Trate o
uso de maiúsculas e minúsculas!!
14. Selecionar seções que contenham somente dois parágrafos
15. Selecione os elementos "ano" descendentes de bibliografia
16. Encontre a instrução de processamento de algum elemento paragrafo.
36. Resumo das funções, XPath 1.0
Tabela baseada nas funções apresentadas na página da W3C
9 Funções para nodos (elementos)
Nome Sintaxe Descrição
count() count(node-set) = number Retorna o número de nodos de
um node-set
id() id(value) = node-set Seleciona elementos pelo seu
ID único
last() last() = number Retorna o número da posição
do ultimo nodo em uma lista
de nodos processados
local-name() local-name(node)= string Retorna a parte local de um
nodo. Um nodo geralmente
consiste de um prefixo, uma
vírgula e seguida de um nome
local
name() name(node) = string Retorna o nome de um nodo
namespace-uri() namespace-uri(node) = uri Retorna a URI da namespace
de um nodo específico
position() position() = number Retorna a posição em uma
lista de nodos do nodo que
está sendo processado
37. Resumo das funções, XPath 1.0
Tabela baseada nas funções apresentadas na página da W3C
9 Funções para string
Nome Sintaxe e Exemplo Descrição
concat() string=concat(val1, val2, ..) Retorna a concatenação de todos
Exemplo: os seus argumentos
concat('The',' ','XML')
Resultado: 'The XML'
contains() bool=contains(val,substr) Retorna true se a segunda string
Exemplo: está contida na primeira
contains('XML','X')
Resultado: true
normalize- string=normalize- Normaliza os espaços em
space() space(string) broncos para um só
Exemplo:
normalize-space(' The XML
')
Resultado: 'The XML'
starts-with() bool=starts- Retorna true se a primeira string
with(string,substr) inicia com a segunda
Exemplo:
starts-with('XML','X')
Resultado: true
string() string(value) Converte o valor do argumento
Exemplo: para string
string(314)
Resultado: '314'
38. Resumo das funções, XPath 1.0
Tabela baseada nas funções apresentadas na página da W3C
9 Funções para string
Nome Sintaxe e Exemplo Descrição
string- number=string-length(string) Retorna o número de
length() Exemplo: caracteres em uma string
string-length('Beatles')
Resultado: 7
substring() string=substring(string,start,length) Retorna a parted a string
Exemplo: indicada nos argumentos
substring('Beatles',1,4)
Resultado: 'Beat'
substring- string=substring-after(string,substr) Retorna a parte da string
after() Exemplo: que está depois do
substring-after('12/10','/') argumento substr
Resultado: '10'
substring- string=substring-before(string,substr) Retorna a parted a string
before() Exemplo: que está antes do
substring-before('12/10','/') argumento substr
Resultado: '12'
translate() string=translate(value,string1,string2) Executa reposição
Exemplo: character a character.
translate('12:30','30','45')
Resultado: '12:45'
translate('12:30','03','54')
Resultado: '12:45'
translate('12:30','0123','abcd')
Resultado: 'bc:da'
39. Resumo das funções, XPath 1.0
Tabela baseada nas funções apresentadas na página da W3C
9 Funções para numéricos
Nome Sintaxe e Exemplo Descrição
ceiling() ceiling(number) = number Retorna o menor inteiro que não pe
Exemplo: menor do que o argumento
ceiling(3.14)
Resultado: 4
floor() floor(number) = number Retorna o maior inteiro que não é maior
Exemplo: do que o argumento
floor(3.14)
Resultado: 3
number() number(value) = number Converte o valor do argumento para um
Exemplo: numérico
number('100')
Resultado: 100
round() round(number)= integer Arredonda o argumento ao inteiro mais
Exemplo: próximo
round(3.14)
Resultado: 3
sum() sum(nodeset)=number Retorna o valor total de um conjunto
Exemplo: numérico de valores em um node-set
sum(/cd/price)
40. Resumo das funções, XPath 1.0
Tabela baseada nas funções apresentadas na página da W3C
9 Funções booleanas
Nome Sintaxe e Exemplo Descrição
boolean() bool=boolean(value) Converte o argumento e retorna
true ou false
false() false() Retorna false
Exemplo:
number(false())
Resultado: 0
lang() bool=lang(language) Retorna true se a linguagem do
argumento casa com a linguagem
do elemento xsl:lang
not() bool=not(condition) Retorna true se a condição de
argumento for falsa, e falsa se a
Exemplo: condição for verdadeira
not(false())
true() true() Retorna true
Exemplo:
number(true())
Resultado: 1
41. Xpath e Java
ƒ Java tem um pacote para lidar com expressões
XPath
9 javax.xml.xpath
9 Documentação:
http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/xpath/pa
ckage-summary.html