XPath é uma linguagem de consulta projetada para utilização com
documentos XML, mas você pode utilizá-la com qualquer estrutura em árvore
para consultar conteúdo.
WebSphere Message Broker utiliza
XPath para selecionar elementos da árvore de mensagens lógica, independentemente do
formato do fluxo de bits. A terminologia utilizada neste tópico é baseada na terminologia utilizada na
definição do W3C para XPath 1.0. Para obter informações adicionais sobre XPath, consulte Utilizando XPath; e, para obter informações sobre a definição de W3C do padrão do XPath 1.0, consulte Especificação de W3C XPath 1.0.
Para obter exemplos da utilização de XPath, consulte o tópico MbXPath na documentação de API de Nó Java Definido Pelo Usuário.
Este tópico contém as seguintes informações:
Utilizando o Método evaluateXPath para Extrair
Informações de Mensagens
O método
evaluateXPath() é incluído na API do nó definido pelo
usuário Java. Ele suporta
XPath 1.0, com as exceções a seguir:
- Tipo de eixo de espaço de nomes e nó de espaço de nomes. O eixo de espaço de nomes retorna os nós de declaração de espaço de nomes XML em si para um determinado elemento.
Portanto, é possível manipular
prefixo XML ou declarações URI em uma expressão XPath. Esse eixo retorna um conjunto de nós vazio para fluxos de bits que não são XML.
- Se você utilizar a função id(), ela emitirá uma MbRecoverableException.
O
método evaluateXPath() pode ser chamado em um objeto MbMessage (para
caminhos absolutos) ou em um objeto MbElement (para caminhos relativos). A expressão
XPath é tramsitida ao método como um parâmetro de cadeia. Uma segunda
forma desse método é fornecida, utilizando o objeto MbXPath. Esse objeto encapsula uma expressão XPath juntamente com ligações de variáveis e mapeamentos de espaço de nomes, se forem requeridos.
O
método
evaluateXPath() retorna um objeto de um destes quatro tipos,
dependendo do tipo de retorno da expressão:
- java.lang.Boolean, representando o tipo Booleano do XPath
- java.lang.Double, representando o tipo de número do XPath
- java.lang.String, representando o tipo de cadeia do XPath
- java.util.List, representando o conjunto de nós do XPath. A interface Lista representa uma seqüência ordenada de objetos, neste caso MbElements.
Permite acesso direto
aos elementos ou a capacidade de obter um Iterador ou uma matriz
MbElement.
Ligação de Variável XPath
XPath 1.0
suporta a capacidade de fazer referência a variáveis que foram designadas antes a avaliação da expressão
que as contém. A classe MbXPath utiliza três métodos para designar e remover essas ligações de variável a partir do
código Java do usuário.
O valor deve ser um entre quatro tipos XPath 1.0 suportados:
- Booleano
- conjunto de nós
- número
- string
Suporte a Espaço de Nomes do XPath
Para mensagens
XML, os espaços de nomes são referidos usando um mapeamento de um prefixo de espaço de nomes
abreviado para o URI de espaço de nomes completo, conforme
mostrado no seguinte exemplo de XML:
<ns1:aaa xmlns:ns1='http://mydomain.com/namespace1'
xmlns:ns2='http://mydomain.com/namespace2'>
<ns2:aaa>
<ns1:bbb/>
</ns2:aaa>
</ns1:aaa>
O prefixo de espaço de nomes é conveniente para
representar o espaço de nomes, mas significativo apenas no documento que define esse
mapeamento. O URI do espaço de nomes define o significado global. Além disso, o conceito de
um prefixo de espaço de nomes não é significativo para documentos gerados em um
fluxo de mensagens, porque um URI de espaço de nomes pode ser
designado a um elemento de sintaxe sem um mapeamento XMLNS ter sido definido.
Por isso, os analisadores XMLNSC e MRM
expõem apenas o URI de espaço de nomes para o intermediário e para o código do usuário (código ESQL ou definido pelo usuário). Usando ESQL, você pode
configurar seus próprios mapeamentos para criar abreviações para esses
URIs potencialmente longos. Esses mapeamentos não estão relacionados de forma alguma a prefixos definidos no documento XML (apesar de eles poderem ter o mesmo nome).
Usando o processador XPath, você pode mapear abreviações de
espaço de nomes para URIs que são expandidos n tempo de avaliação. A classe MbXPath contém métodos para designar e remover esses mapeamentos de espaço de nomes. Por Exemplo:
MbXPath xp = new MbXPath("/aaa/other:aaa/bbb");
xp.addNamespacePrefix("other", "http://mydomain.com/namespace2");
xp.setDefaultNamespace("http://mydomain.com/namespace2");
List nodeset = (List)message.evaluateXPath(xp);
Atualizando uma Mensagem Usando Extensões XPath
A
implementação do XPath no
WebSphere Message Broker fornece as seguintes
funções adicionais para modificar a árvore de mensagens:
- set-local-name(object)
- Configura a parte local do nome expandido do nó de contexto para o valor
especificado no argumento. object pode ser qualquer expressão válida, e será convertido em uma
cadeia se uma chamada para a função de cadeia for utilizada.
- set-namespace-uri(object)
- Configura a parte da URI do espaço de nomes do nome expandido do nó de contexto para o valor especificado no argumento. object pode ser qualquer expressão válida, e será convertido em uma
cadeia se uma chamada para a função de cadeia for utilizada.
- set-value(object)
- Essa função configura o valor da cadeia do nó de contexto para o valor especificado no argumento. object pode ser qualquer expressão válida, e será convertido em uma
cadeia se uma chamada para a função de cadeia for utilizada.
Para permitir que as árvores de elementos de sintaxe sejam construídas, assim como modificadas, o eixo a seguir está disponível, além dos 13 definidos na especificação do
XPath 1.0:
- select-or-create::name ou ?name
- ?name é equivalente a select-or-create::name.
Se name for @name, um atributo será criado ou selecionado.
Isso seleciona nós filhos que correspondem ao nome especificado ou cria novos nós de
acordo com as seguintes regras:
- ?name seleciona filhos chamados name,
se existirem. Se um filho chamado name não existir,
?name o criará como último filho; em seguida, o selecionará.
- ?$name cria name como o último
filho e, em seguida, o seleciona.
- ?^name cria name como o primeiro
filho e, em seguida, o seleciona.
- ?>name cria name como o próximo irmão
e, em seguida, o seleciona.
- ?<name cria name como o irmão
anterior e, em seguida, o seleciona.