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.
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.
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.