Camel Apache: xpath para extraer algún valor del XML recibido

durante mis rutas de Camel, consulto un servidor (un HTTP GET) y, como resultado, recibo un 200 OK con un cuerpo XML similar a este:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<userProfiles xmlns="http://www.mycompany.com/AEContext/xmldata">
  <userProfile name="guest">
    <userProfileAttributes>
      <userProfileAttribute name="parameter1" value="data1" nameVisibility="ALL"/>  
      <userProfileAttribute name="parameter2" value="data2" nameVisibility="ALL"/>
      <userProfileAttribute name="parameter3" value="data3" nameVisibility="ALL"/>
    </userProfileAttributes>
  </userProfile>
</userProfiles>

¿Alguna idea de cómo podría obtener el valor de "parámetro2" en la parte XML (en mi ejemplo 'datos2') y almacenar ese valor en una propiedad de intercambio? ¿Supongo que usando una expresión xpath? O... Gracias por tu ayuda.

preguntado el 09 de marzo de 12 a las 15:03

1 Respuestas

Una manera fácil de recuperar el valor sería usar el Lenguaje XPath. Le permitirá extraer los datos que desee y configurarlos en algún lugar (encabezado, cuerpo, ...). Aquí se explica cómo configurar un parameter2 encabezado con el valor:

<setHeader headerName="parameter2">
  <xpath resultType="java.lang.String">
    /userProfiles/userProfile/userProfileAttributes/userProfileAttribute[2]/@value
  </xpath>
</setHeader>

Uso de DSL de Java

Un ejemplo usando Java DSL y configurando el cuerpo del mensaje:

final Namespaces ns = new Namespaces("c", "http://www.mycompany.com/AEContext/xmldata");

// existing code
from(...)
  .setBody(
    ns.xpath(
      "/c:userProfiles/userProfile/userProfileAttributes/userProfileAttribute[2]/@value",   
      String.class)
   )
   .to(...);

respondido 20 mar '17, 08:03

Hola Olivier, gracias desde ya por tu respuesta. Tengo 1 pregunta adicional: supongamos que no siempre estoy seguro de que el parámetro userProfileAttribute que necesito esté en la posición 2. ¿Hay alguna forma de hacer referencia a través de Xpath al userProfileAttribute con el nombre "parameter2" para obtener su valor? - opstalj

¿Podría ser así: /userProfiles/userProfile/userProfileAttributes/userProfileAttribute[@name='parameter2']/@value ? - opstalj

Se debe admitir cualquier expresión XPath válida. Acabo de extraer la ruta usando FOXE (firstobject.com/dn_editor.htm) - olivier.roger

FYI: como el XML anterior contiene un espacio de nombres, primero necesitaba definir ese espacio de nombres en mi ruta CAMEL. Luego, más adelante, consúltelo cuando extraiga datos del XML a través de XPath. Entonces, en el ejemplo anterior: Namespaces ns = new Namespaces ("contextinfo", "miempresa.com/AEContext/xmldata") y luego, use algo como: ns.xpath("//contextinfo:userProfileAttribute[@name='subscriberName']/@value", String.class). - opstalj

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.