Extraindo Informações de uma Mensagem Utilizando XPath 1.0 e um Nó JavaCompute

XPath é uma linguagem de consulta projetada para utilização com documentos XML, mas pode ser aplicada a qualquer estrutura em árvore para finalidades de consulta. WebSphere Message Broker utiliza XPath para selecionar elementos da árvore de mensagens lógica, independentemente do formato do fluxo de bits. Para obter informações adicionais sobre XPath e a definição do W3C do padrão XPath 1.0, consulte XPath. A terminologia utilizada neste tópico é baseada na terminologia utilizada na definição do W3C para XPath 1.0.

Este tópico contém as seguintes informações:

Utilizando o Método evaluateXPath para Extrair Informações de Mensagens

O método evaluateXPath() está incluído na API Java do nó definido pelo usuário e suporta XPath 1.0, com as seguintes exceções:
  • 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. Isso permite manipular o prefixo XML ou as declarações de 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

O XPath 1.0 suporta a capacidade de fazer referência a variáveis dentro de uma expressão designada antes da avaliação. A classe MbXPath possui três métodos para designar e remover essas ligações de variáveis 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 utilizando-se um mapeamento de um prefixo de espaço de nomes abreviado para o URI do espaço de nomes completo, conforme mostrado no exemplo XML a seguir:
<ns1:aaa xmlns:ns1='http://mydomain.com/namespace1'
         xmlns:ns2='http://mydomain.com/namespace2'>
  <ns2:aaa>
    <ns1:bbb/>
  </ns2:aaa>
</ns1:aaa>

Apesar do prefixo do espaço de nomes ser conveniente para representar o espaço de nomes, é significativo somente no documento que define esse mapeamento. O URI do espaço de nomes é que define o significado global. Além disso, o conceito de um prefixo do espaço de nomes não é significativo para documentos gerados em um fluxo de mensagens, pois uma URI de espaço de nomes pode ser designada a um elemento de sintaxe sem a definição de um mapeamento xmlns.

Por essa razão, os analisadores XMLNS(C) e MRM expõem somente a URI do espaço de nomes para o intermediário e o código do usuário (código ESQL ou plug-in). O ESQL permite que o usuário configure 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).

O processador do XPath permite mapear abreviações do espaço de nomes para os URIs que são expandidos no tempo de avaliação. A classe MbXPath contém métodos para designar e remover esses mapeamentos de espaço de nomes. O exemplo de XML pode ser abordado utilizando o seguinte código:
MbMessage msg = assembly.getMessage();
List chapters= (List)msg.evaluateXPath("/document/chapter");
// isso retorna uma lista de todos os capítulos do documento (comprimento 1)

MbElement chapter = (MbElement)chapters.get(0);  // o primeiro

// valores também podem ser extraídos diretamente utilizando XPath
String title = (String)msg.evaluateXPath("string(/document/chapter/@title)");

String chapterText = (String)msg.evaluateXPath("string(/document/chapter/text())");

Atualizando uma Mensagem Utilizando Extensões XPath

A implementação do WebSphere Message Broker de XPath fornece as seguintes funções extras 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álido e será convertido para cadeia como se fosse utilizada uma função de chamada à cadeia.
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álido e será convertido para cadeia como se fosse utilizada uma função de chamada à cadeia.
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álido e será convertido para cadeia como se fosse utilizada uma função de chamada à cadeia.
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 or ?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 nametest especificado ou cria novos nós de acordo com as seguintes regras:
  • ?name seleciona filhos chamados name, se existirem. Se não houver nenhum filho chamado name, ?name criará um como o último filho e, 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.
Informações relacionadas
API de Nó Java Definido Pelo Usuário
Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback
Direitos Autorais IBM Corporation 1999, 2006 Última Atualização: 1 Sep 2006
ac30390_