首页 > 解决方案 > 在 apache camel 中使用 xpath 从 xml 中获取值

问题描述

我正在尝试从肥皂服务响应中检索值,如下所示:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <ns2:consultaCEPResponse xmlns:ns2="http://cliente.bean.master.sigep.bsb.correios.com.br/"> 
             <return>
                 <bairro>Jardim das Acácias</bairro>
                 <cep>04707900</cep>
                 <cidade>São Paulo</cidade>
                 <complemento2></complemento2>
                 <end>Avenida Roque Petroni Júnior 1089</end>
                 <uf>SP</uf>
              </return>
        </ns2:consultaCEPResponse>
     </soap:Body>
</soap:Envelope>

我正在使用 apache camel。但是,当我应用 xpath 仅使用返回标记之间的内容时,它将所有内容都放在没有标记的单行上,因此,我无法设置属性

我得到了什么:

INFO 15:23:47.808 - Jardim das Acácias04707900São PauloAvenida Roque Petroni Júnior 1089SP

我想收到的:

<bairro>Jardim das Acácias</bairro>
<cep>04707900</cep>
<cidade>São Paulo</cidade>
<complemento2></complemento2>
<end>Avenida Roque Petroni Júnior 1089</end>
<uf>SP</uf>

然后,执行以下操作:

.setProperty("bairro",xpath("/bairro//text()"))

这是我的代码:

public class RotaEnviaPedidos {
public static void main(String[] args) throws Exception {
    CamelContext context = new DefaultCamelContext();
    context.addRoutes(new RouteBuilder() {

        @Override
        public void configure() throws Exception {
            from("file:pedidos?noop=true")
            .setHeader(Exchange.HTTP_METHOD, simple("POST"))
            .to("https://apps.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente")
            .convertBodyTo(String.class)
            .transform().xpath("//*[local-name()='return']//text()")
            .log("${body}");
        }
    });

    context.start();
    Thread.sleep(2000000000);
    context.stop();
}

}

PS:也许是由于使用了 Then 做类似的事情:

可能是因为使用了 '.convertBodyTo (String.class)' 但是如果我不使用这个命令,会带来如下错误:

 org.apache.camel.TypeConversionException: Error during type conversion from type: java.lang.String to the required type: org.w3c.dom.Document with value [Body is instance of java.io.InputStream] due org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 202; Invalid byte 2 of 3-byte UTF-8 sequence.

标签: javaxpathapache-camel

解决方案


你可以试试下面的:

@Override

   public void configure() throws Exception {
        from("file:pedidos?noop=true")
        .setHeader(Exchange.HTTP_METHOD, simple("POST"))
        .to("https://apps.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente")
        .convertBodyTo(String.class)
        .transform().xpath("//*[local-name()='return']")
        .log("${body}");
    }

推荐阅读