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 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 e a definição de W3C do padrão de 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 Java.

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, espaços de nome são referidos com o uso de um mapeamento de um prefixo de espaço de nome abreviado para o URI de espaço de nome completo, como mostra o 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). Utilizando 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).

Utilizando o processador XPath, você pode mapear as abreviações do espaço de nomes para URIs que são expandidos no momento da 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 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 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 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.
Referências relacionadas
Nó JavaCompute
Informações relacionadas
API de Extensões Definidas pelo Usuário Java
Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback

Copyright IBM Corporation 1999, 2009Copyright IBM Corporation 1999, 2009.
Última atualização : 2009-02-13 16:11:56

ac30390_