Tutorial XPath XML

  • Post author:
  • Post category:Sem categoria

Colabora??o: Ot?vio Augusto Bizetto Penatti

Este tutorial ? uma tradu??o do tutorial de XPath da W3Schools (http://www.w3schools.com/), dispon?vel em http://www.w3schools.com/xpath/default.asp

Tutorial XPath
==============

XPath ? um conjunto de regras de sintaxe para definir partes de um documento XML.

XPath ? o elemento principal no padr?o W3C XSLT. Sem o conhecimento de XPath voc? n?o ser? capaz de criar documentos XSLT.

Introdu??o ao XPath
===================

XPath ? um conjunto de regras de sintaxe para definir partes de um documento XML.

O que ? XPath?
==============

– XPath ? uma sintaxe para definir partes de um documento XML
– XPath usa caminhos para definir elementos XML
– XPath define uma biblioteca de fun??es padr?o
– XPath ? o elemento principal em XSLT
– XPath n?o ? escrito em XML
– XPath ? um padr?o W3C

Como caminhos de arquivos tradicionais
======================================

XPath usa express?es de caminho para identificar n?s em um documento XML. Essas express?es de caminho se parecem muito com as express?es que voc? v? quando voc? trabalha num sistema de arquivos de um computador:

w3schools/xpath/default.asp

Exemplo de XPath
================

Veja esse documento XML simples:

< ?xml version="1.0" encoding="ISO-8859-1"?>


Empire Burlesque
Bob Dylan 10.90


Hide your heart
Bonnie Tyler 9.90


Greatest Hits
Dolly Parton 9.90

A express?o XPath abaixo seleciona o elemento RAIZ catalog:

/catalog

A express?o XPath abaixo seleciona todos os elementos cd do elemento catalog:

/catalog/cd

A express?o XPath abaixo seleciona todos os elementos price de todos os elementos cd do elemento catalog:

/catalog/cd/price

Nota: Se o caminho come?a com uma barra ( / ) ele representa um caminho absoluto para um elemento!

XPath define uma biblioteca de fun??es padr?o
=============================================

XPath define uma biblioteca de fun??es padr?o para trabalhar com strings, n?meros e express?es booleanas.

A express?o XPath abaixo seleciona todos os elementos cd que tem um elemento price que tem um valor maior que 10.80:

/catalog/cd[price>10.80]

XPath ? usado em XSLT
=====================

XPath ? o elemento principal do padr?o XSLT. Sem o conhecimento de XPath voc? n?o ser? capaz de criar documentos XSLT.

Voc? pode ler mais sobre XSLT no nosso tutorial XSLT em ingl?s (http://www.w3schools.com/xsl/default.asp) ou em portugu?s (xslt.htm).

XPath ? um padr?o W3C
=====================

XPath foi liberado com uma recomenda??o W3C em 16 de novembro de 1999 como uma linguagem para endere?ar partes de um documento XML.

XPath foi desenvolvido para ser usado por XSLT, XPointer e outros softwares XML parsing.

Voc? pode ler mais sobre padr?es XML e XSl em nosso tutorial W3C (http://www.w3schools.com/w3c/default.asp)

Sintaxe XPath
=============

XPath usa express?es de caminho para localizar n?s dentro de documentos XML.

Documento XML de Exemplo
========================

N?s usaremos esse documento XML simples para descrever a sintaxe XPath:

< ?xml version="1.0" encoding="ISO-8859-1"?>


Empire Burlesque
Bob Dylan 10.90


Hide your heart
Bonnie Tyler 9.90


Greatest Hits
Dolly Parton 9.90

Localizando N?s
===============

Documentos XML podem ser representados como ?rvores de n?s (muito similar ? vis?o em ?rvore das pastas do seu computador).

XPath usa uma express?o padr?o para identificar n?s em um documento XML. Um padr?o XPath ? uma lista nomes de elementos filhos separada por barras que descreve o caminho atrav?s do documento XML. O padr?o “seleciona” elementos que combinam com o caminho.

A express?o XPath a seguir seleciona todos os elementos pre?o de todos os elementos cd do elemento catalog:

/catalog/cd/price

Nota: Se o caminho come?a com uma barra ( / ) ele representa um caminho absoluto para um elemento!

Nota: Se o caminho come?a com duas barras ( // ) ent?o todos os elementos no documento que se encaixam no crit?rio ser?o selecionados (mesmo que eles estejam em n?veis diferentes da ?rvore XML)!

A express?o XPath a seguir seleciona todos os elementos cd no documento:

//cd

Selecionando elementos desconhecidos
====================================

Curingas ( * ) podem ser usados para selecionar elementos XML desconhecidos.

A express?o XPath a seguir seleciona todos os elementos filhos de todos os elementos cd do elemento catalog:

/catalog/cd/*

A express?o XPath a seguir seleciona todos os elementos price que s?o elementos netos do elemento catalog:

/catalog/*/price

A express?o XPath a seguir seleciona todos os elementos price que t?m dois ancestrais:

/*/*/price

A express?o XPath a seguir seleciona todos os elementos no documento:

//*

Selecionando Se??es
===================

Usando-se colchetes numa express?o XPath voc? pode especificar um elemento adiante.

A express?o XPath a seguir seleciona o primeiro elemento cd filho do elemento catalog:

/catalog/cd[1]

A express?o XPath a seguir seleciona o ?ltimo elemento cd filho do elemento catalog (Nota: n?o existe a fun??o first()):

/catalog/cd[last()]

A express?o XPath a seguir seleciona todos os elementos cd do elemento catalog que tem um elemento price:

/catalog/cd[price]

A express?o XPath a seguir seleciona todos os elementos cd do elemento catalog que tem um elemento price com valor de 10.90:

/catalog/cd[price=10.90]

A express?o XPath a seguir seleciona todos os elementos price de todos os elementos cd do elemento catalog que tem um elemento price com valor de 10.90:

/catalog/cd[price=10.90]/price

Selecionando v?rios caminhos
============================

Usando o operador “|” numa express?o XPath voc? pode selecionar v?rios caminhos.

A express?o XPath a seguir seleciona todos os elementos title e artist do elemento cd do elemento catalog:

/catalog/cd/title | /catalog/cd/artist

A express?o XPath a seguir seleciona todos os elementos title e artist do documento:

//title | //artist

A express?o XPath a seguir seleciona todos os elementos title, artist e price do documento:

//title | //artist | //price

A express?o XPath a seguir seleciona todos os elementos title do elemento cd do elemento catalog, e todos os elementos artist no documento:

/catalog/cd/title | //artist

Selecionando atributos
======================

Em XPath todos os atributos s?o especificados pelo prefixo “@”.

Esta express?o XPath seleciona todos os atributos chamados country:

//@country

Esta express?o XPath seleciona todos os elementos cd que tem um atributo chamado country:

//cd[@country]

Esta express?o XPath seleciona todos os elementos cd que tem algum atributo:

//cd[@*]

Esta express?o XPath seleciona todos os elementos cd que tem um atributo chamado country com valor ‘UK’:

//cd[@country=’UK’]

XPath Location Paths (Caminho Locais XPath)
===========================================

Uma express?o de caminho local (location path) resulta em um conjunto de n?s.

Express?o de Caminho Local
==========================

Um caminho local pode ser absoluto ou relativo.

Um caminho local absoluto come?a com uma barra ( / ) e um caminho local relativo n?o. Em ambos os casos o caminho local consiste de um ou mais n?veis de localiza??o, cada um separado por uma barra:

Um caminho local absoluto:

/step/step/…

Um caminho local relativo:

step/step

Os n?veis de localiza??o s?o avaliados em ordem um de cada vez, da esquerda pra direita. Cada n?vel ? avaliado segundo os n?s no conjunto de n?s atual. Se o caminho local ? absoluto, o conjunto de n?s atual ? o n? raiz. Se o caminho local ? relativo, o conjunto de n?s atual consiste do n? onde a express?o est? sendo usada. N?veis de localiza??o consistem de:
– um eixo (especifica a rela??o de ?rvore entre os n?s selecionados pelo n?vel de localiza??o e o n? atual)
– um n? teste (especifica o tipo de n? e o nome expandido dos n?s selecionados pelo n?vel de localiza??o)
– zero ou mais predicados (usa express?es para refinar mais o conjunto de n?s selecionado pelo n?vel de localiza??o)

A sintaxe para um n?vel de localiza??o ?:

nomeeixo::noteste[predicado]

Exemplo:

child::price[price=9.90]

Eixos e N?s de Teste
====================

Um eixo define um conjunto de n?s relativo ao n? atual. Um n? de teste ? usado para identificar um n? dentro de um eixo. N?s podemos executar um n? de teste por nome ou por tipo.

|| Nome do Eixo | Descri??o ||
| ancestor | Cont?m todos os ancestrais (pais, av?s, etc) do n? atual. Nota: Este eixo incluir? sempre o n? raiz, a menos que o n? atual seja o n? raiz |
| ancestor-or-self | Cont?m o n? atual mais todos os seus ancestrais (pai, av?, etc) |
| attribute | Cont?m todos os atributos do n? atual |
| child | Cont?m todos os filhos do n? atual |
| descendant | Cont?m todos os descendentes (filhos, netos, etc) do n? atual. Nota: Este eixo nunca cont?m atributos ou n?s namespace |
| descendant-or-self | Cont?m o n? atual mais todos os seus descendentes (filhos, netos, etc) |
| following | Cont?m tudo no documento depois da tag de fechamento do n? atual |
| following-sibling | Cont?m todos os irm?os depois do n? atual. Nota: Se o n? atual ? um n? atributo ou um n? namespace, este eixo estar? vazio |
| namespace | Cont?m todos os n?s namespace do n? atual |
| parent | Cont?m o pai do n? atual |
| preceding | Cont?m tudo no documento que est? antes da tag de abertura do n? atual |
| preceding-sibling | Cont?m todos os irm?os antes do n? atual. Nota: Se o n? atual ? um n? atributo ou um n? namespace, este eixo estar? vazio |
| self | Cont?m o n? atual |

Exemplos

|| Exemplo | Resultado ||
| child::cd | Seleciona todos os elementos cd que s?o filhos do n? atual (se o n? atual n?o tem cds filhos, ser? selecionado um conjunto vazio de n?s) |
| attribute::src | Seleciona o atributo src do n? atual (se o n? atual n?o tem atributo src, ser? selecionado um conjunto vazio de n?s) |
| child::* | Seleciona todos os elementos filhos do n? atual |
| attribute::* | Seleciona todos os atributos do n? atual |
| child::text() | Seleciona o n? texto filho do n? atual |
| child::node() | Seleciona todos os filhos do n? atual |
| descendant::cd | Seleciona todos os elementos cd descendentes do n? atual |
| ancestor::cd | Seleciona todos os cds ancestrais do n? atual |
| ancestor-or-self::cd | Seleciona todos os cds ancestrais do n? atual e, se o n? atual ? um elemento cd, seleciona o n? atual tamb?m |
| child::*/child::price | Seleciona todos os pre?os netos do n? atual |
| / | Seleciona a raiz do documento |

Predicados
==========

Um predicado filtra um conjunto de n?s em um novo conjunto de n?s. Um predicado fica dentro de colchetes ( [] ).

Exemplos

|| Exemplo | Resultado ||
| child::price[price=9.90] | Seleciona todos os elementos price que s?o filhos do n? atual com um pre?o igual a 9.90 |
| child::cd[position()=1] | Seleciona o primeiro cd filho do n? atual |
| child::cd[position()=last()] | Seleciona o ?ltimo cd filho do n? atual |
| child::cd[position()=last()-1] | Seleciona o pen?ltimo cd filho do n? atual |
| child::cd[position()<6] | Seleciona os primeiros cinco cds filhos do n? atual |
| /descendant::cd[position()=7] | Seleciona o s?timo elemento cd no documento |
| child::cd[attribute::type=”classic”] | Seleciona todos os cds filhos do n? atual que t?m um atributo tipo com o valor “classic” |

Sintaxe Abreviada dos Caminhos Locais
=====================================

Abrevia??es podem ser usadas para descrever um caminho local.

A abrevia??o mais importante ? que child:: pode ser omitido de um n?vel de localiza??o.

|| Abrev. | Significado | Exemplo ||
| nada | child:: | cd ? o mesmo que child::cd |
| @ | attribute:: | cd[@type=”classic”] ? o mesmo que child::cd[attribute::type=”classic”] |
| . | self::node() | .//cd ? o mesmo que self::node()/descendant-or-self::node()/child::cd |
| .. | parent::node() | ../cd ? o mesmo que parent::node()/child::cd |
| //// | /descendant-or-self::node()/ | //cd ? o mesmo que /descendant-or-self::node()/child::cd |

Exemplos

|| Exemplo | Resultado ||
| cd | Seleciona todos os elementos cd que s?o filhos do n? atual |
| * | Seleciona todos os elementos filhos do n? atual |
| text() | Seleciona todos os n?s textos filhos do n? atual |
| @src | Seleciona o atributo src do n? atual |
| @* | Seleciona todos os atributos do n? atual |
| cd[1] | Seleciona o primeiro cd filho do n? atual |
| cd[last()] | Seleciona o ?ltimo cd filho do n? atual |
| */cd | Seleciona todos os cds netos do n? atual |
| /book/chapter[3]/para[1] | Seleciona o primeiro par?grafo do terceiro cap?tulo do livro |
| //cd | Seleciona todos os elementos cds descendentes da raiz do documento e assim seleciona todos os elementos cds no mesmo documento como o n? atual |
| . | Seleciona o n? atual |
| .//cd | Seleciona os elementos cds descendentes do n? atual |
| .. | Seleciona o pai do n? atual |
| ../@src | Seleciona o atributo src do pai do n? atual |
| cd[@type=”classic”] | Seleciona todos os cds filhos do n? atual que t?m o atributo “type” com o valor “classic” |
| cd[@type=”classic”][5] | Seleciona o quinto cd filho do n? atual que tem o atributo “type” com o valor “classic” |
| cd[5][@type=”classic”] | Seleciona o quinto cd filho do n? atual se esse filho tem o atributo “type” com valor “classic” |
| cd[@type and @country ] | Seleciona todos os cds filhos do n? atual que t?m ambos os atributos “type” e “country” |

Express?es XPath
================

XPath suporta express?es num?ricas, de igualdade, relacionais e booleanas.

Express?es Num?ricas
====================

Express?es num?ricas s?o usadas para realizar opera??es aritm?ticas em n?meros.

|| Operador | Descri??o | Exemplo | Resultado ||
| + | Adi??o | 6 + 4 | 10 |
| – | Subtra??o | 6 – 4 | 2 |
| * | Multiplica??o | 6 * 4 | 24 |
| div | Divis?o | 8 div 4 | 2 |
| mod | M?dulo (resto da divis?o) | 5 mod 2 | 1 |

Nota: XPath sempre converte cada operando em um n?mero antes de realizar um express?o aritm?tica.

Express?es de Igualdade
=======================

Express?es de igualdade s?o usadas para testar a igualdade entre dois valores.

|| Operador | Descri??o | Exemplo | Resultado ||
| = | Igual | price=9.80 | true (se o pre?o ? igual a 9.80) |
| != | Diferente | price!=9.80 | false |

Testando um conjunto de n?s
===========================

Se ? testada a igualdade do valor de teste em rela??o a um conjunto de n?s, o resultado ? verdadeiro se o conjunto de n?s cont?m algum n? com um valor igual ao valor de teste.

Se ? testada a desigualdade do valor de teste em rela??o a um conjunto de n?s, o resultado ? verdadeiro se o conjunto de n?s cont?m algum n? com um valor diferente ao valor de teste.

O resultado ? que o conjunto de n?s pode ser igual e diferente ao mesmo tempo!!!

Express?es Relacionais
======================

Express?es relacionais s?o usadas para comparar dois valores.

|| Operador | Descri??o | Exemplo | Resultado ||
| < | Menor | price<9.80 | false (se o pre?o ? 9.80) |
| <= | Menor ou igual | price<=9.80 | true |
| > | Maior | price>9.80 | false |
| >= | Maior ou igual | price>=9.80 | true |

Nota: XPath sempre converte cada operando em um n?mero antes de fazer a avalia??o.

Express?es Booleanas
====================

Express?es booleanas s?o usadas para comparar dois valores.

|| Operador | Descri??o | Exemplo | Resultado ||
| or | Ou | price=9.80 or price=9.70 | true (se o pre?o ? 9.80) |
| and | E | price< =9.80 and price=9.70 | false | Fun??es XPath
=============

XPath cont?m uma biblioteca de fun??es para convers?o de dados.

Biblioteca de Fun??es XPath
===========================

A biblioteca de fun??es XPath cont?m um conjunto de fun??es centrais para convers?o e tradu??o de dados.

Fun??es para Conjunto de N?s
============================

|| Nome | Descri??o | Sintaxe ||
| count() | Retorna o n?mero de n?s num conjunto de n?s | number=count(node-set) |
| id() | Seleciona elementos pelo seu ID ?nico | node-set=id(value) |
| last() | Retorna o n?mero da posi??o do ?ltimo n? na lista de n?s processados | number=last() |
| local-name() | Retorna a parte local de um n?. Um n? normalmente consiste de um prefixo, os dois pontos, seguidos pelo nome local | string=local-name(node) |
| name() | Retorna o nome do n? | string=name(node) |
| namespace-uri() | Retorna o namespace URI de um n? espec?fico | uri=namespace-url(node) |
| position() | Retorna a posi??o na lista de n?s do n? que est? sendo processado atualmente | number=position() |

Fun??es de Strings
==================

|| Nome | Descri??o | Sintaxe | Exemplo ||
| concat() | Retorna a concatena??o de todos os argumentos | string=concat(val1,val2,…) | concat(‘The’,’ ‘,’XML’) -> Resultado: ‘The XML’ |
| contains() | Retorna verdadeiro se a segunda string est? contida dentro da primeira string, sen?o retorna falso | bool=contains(val,substr) | contains(‘XML’,’X’) -> Restultado: true |
| normalize-space() | Remove espa?os antes e depois de uma string e substitui todas as seq??ncias internas de espa?os por um ?nico espa?o em branco | string=normalize-space(string) | normalize-space(‘ The XML ‘) -> Resultado: ‘The XML’ |
| starts-with() | Retorna verdadeiro se a primeira string come?a com a segunda string, sen?o retorna falso | bool=starts-with(string,substr) | starts-with(‘XML’,’X’) -> Resultado: true |
| string() | Converte o argumento em string | string(value) | string(314) -> Resultado: ‘314’ |
| string-length() | Retorna o n?mero de caracteres de uma string | number=string-length(string) | string-length(‘Beatles’) -> Resultado: 7 |
| substring() | Retorna um peda?o da string | string=substring(string,start,length) | substring(‘Beatles’,1,4) -> Resultado: ‘Beat’ |
| substring-after() | Retorna a parte da string que aparece depois do argumento substr | string=substring-after(string,substr) | substring-after(’12/10′,’/’) -> Resultado: ’10’ |
| substring-before() | Retorna a parte da string que aparece antes do argumento substr | string=substring-before(string,substr) | substring-before(’12/10′,’/’) -> Resultado: ’12’ |
| translate() | Realiza uma substitui??o caracter por caracter. Ela procura no argumento ‘value’ os caracteres contidos na ‘string1’ e substitui cada caractere pelo caractere da mesma posi??o na ‘string2′ | string=translate(value,string1,string2) | translate(’12:30′,’30’,’45’) ——-> Resultado: ’12:45′ —————– translate(’12:30′,’03’,’54’) ——-> Resultado: ’12:45′ —————– translate(’12:30′,’0123′,’abcd’) ——-> Resultado: ‘bc:da’ |

Fun??es Num?ricas
=================

|| Nome | Descri??o | Sintaxe | Exemplo ||
| ceiling() | Retorna o menor inteiro que n?o ? menor que o argumento (fun??o teto) | number=ceiling(number) | ceiling=(3.14) -> Resultado: 4 |
| floor() | Retorna o maior inteiro que n?o ? maior que o argumento (fun??o ch?o) | number=floor(number) | floor(3.14) -> Resultado: 3 |
| number() | Converte o argumento em um n?mero | number=number(value) | number(‘100’) -> Resultado: 100 |
| round() | Arredonda o argumento para o inteiro mais pr?ximo | integer=round(number) | round(3.14) -> Resultado: 3 |
| sum() | Retorna o valor total de um conjunto de valores num?ricos num conjunto de n?s | number=sum(nodeset) | sum(/cd/price) |

Fun??es Booleanas
=================

|| Nome | Descri??o | Sintaxe ||
| boolean() | Converte o argumento ‘value’ em Booleano e retorna verdadeiro ou falso | bool=boolean(value) |
| false() | Retorna falso | false() Exemplo: number(false()) -> Resultado: 0 |
| lang() | Retorna verdadeiro se o argumento ‘language’ ? igual ao idioma do elemento xsl:lang, sen?o retorna falso | bool=lang(language) |
| not() | Retorna verdadeiro se o argumento ‘condition’ ? falso, e falso se o argumento ? verdadeiro | bool=not(condition) Exemplo: not(false()) |
| true() | Retorna verdadeiro | true() Exemplo: number(true()) -> Resultado: 1 |

Exemplos XPath
==============

N?s iremos usar o cat?logo de CDs do nosso tutorial de XML para demonstrar alguns exemplos XPath.

O cat?logo de CDs
=================

Se voc? estudou o nosso tutorial de XML voc? lembrar? de documento XML:
(Uma fra??o do catalogo)

< ?xml version="1.0" encoding="ISO-8859-1"?>


Empire Burlesque
Bob Dylan
USA
Columbia 10.90 1985


Hide your heart
Bonnie Tyler
UK
CBS Records 9.90 1988

.
.
.
.

Se voc? tem o IE 5 ou superior voc? pode ver o cdcatalog.xml (http://www.w3schools.com/xpath/cdcatalog.xml).

Selecionando N?s
================

N?s demonstraremos como selecionar n?s de um documento XML usando a fun??o selectNodes no Internet Explorer. Esta fun??o tem uma express?o de caminho local como argumento:

xmlobject.selectNodes(Xpath expression)

Selecionando N?s cd
===================

O exemplo a seguir seleciona somente o primeiro n? do cat?logo de cds:

xmlDoc.selectNodes(“/catalog/cd[0]”)

Se voc? tem o IE 5 ou superior voc? pode fazer mais testes (http://www.w3schools.com/xpath/tryit.asp?filename=try_xpath_select_cdnodes_first).

Nota: IE 5 implementou que [0] deveria ser o primeiro n?, mas de acordo com o padr?o W3C, deve ser [1].

Selecionando N?s price
======================

O exemplo a seguir seleciona todos os n?s price do cat?logo de cds:

xmlDoc.selectNodes(“/catalog/cd/price”)

Se voc? tem o IE 5 ou superior voc? pode fazer mais testes (http://www.w3schools.com/xpath/tryit.asp?filename=try_xpath_select_pricenodes).

Selecionando o texto dos N?s price
==================================

O exemplo a seguir seleciona apenas o texto dos n?s price:

xmlDoc.selectNodes(“/catalog/cd/price/text()”)

Se voc? tem o IE 5 ou superior voc? pode fazer mais testes (http://www.w3schools.com/xpath/tryit.asp?filename=try_xpath_select_pricenodes_text).

Selecionando N?s cd com price>10.80
===================================

O exemplo a seguir seleciona todos os n?s cd com price>10.80:

xmlDoc.selectNodes(“/catalog/cd[price>10.80]”)

Se voc? tem o IE 5 ou superior voc? pode fazer mais testes (http://www.w3schools.com/xpath/tryit.asp?filename=try_xpath_select_pricenodes_high).

Selecionando N?s price com price>10.80
======================================

O exemplo a seguir seleciona todos os n?s price com price>10.80:

xmlDoc.selectNodes(“/catalog/cd[price>10.80]/price”)

Se voc? tem o IE 5 ou superior voc? pode fazer mais testes (http://www.w3schools.com/xpath/tryit.asp?filename=try_xpath_select_pricenodes_1080).
——————————————————————–
Colabore com a Dicas-L. Publique seu coment?rio sobre esta mensagem
em http://www.Dicas-L.unicamp.br/dicas-l/20050314.php
——————————————————————–
As mensagens da lista Dicas-L s?o veiculadas diariamente
para 26859 assinantes.

Todas as mensagens da Dicas-L ficam armazenadas em
http://www.Dicas-L.unicamp.br/dicas-l/

A redistribui??o desta e outras mensagens da lista Dicas-L pode
ser feita livremente segundo a licen?a Creative Commons
http://creativecommons.org/licenses/by-nc-sa/2.0/br/deed.pt