使用xpath从soap服务获取响应(错误:前缀必须解析为名称空间:soap)

时间:2020-06-08 20:57:55

标签: java xpath soap apache-camel

我正在使用apache骆驼消费肥皂服务。我收到以下答复:

INFO 17:49:59.662 - 
   <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>zzzzzz</bairro>
                     <cep>000000</cep>
                     <cidade>tttttt</cidade>
                     <complemento2>yyyyy</complemento2>
                     <end>xxxxxxxx</end>
                     <uf>wwwww</uf>
                 </return>
          </ns2:consultaCEPResponse>
     </soap:Body>
</soap:Envelope>

我正在尝试仅获取return标记中包含的内容。但是我收到以下错误:

前缀必须解析为名称空间:ns2

但是当我将前缀更改为ns2时,它要求前缀为soap。

我该怎么做才能获得return标签内的内容?

这是我的代码:

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")
            .transform().xpath("/soap:Envelope/soap:Body/ns2:consultaCEPResponse/return/text()",  
                    new Namespaces("soap","http://schemas.xmlsoap.org/soap/envelope"))
            .log("${body}");
        }
    });

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

}

1 个答案:

答案 0 :(得分:1)

您可能应该在XPath表达式中添加缺少的名称空间声明。像这样的东西:

transform().xpath("/soap:Envelope/soap:Body/ns2:consultaCEPResponse/return//text()",  
                    new Namespaces("soap", "http://schemas.xmlsoap.org/soap/envelope/")
        .add("ns2", "http://cliente.bean.master.sigep.bsb.correios.com.br/"))

如果这行不通,一种方法也可以是:

transform().xpath("//*[local-name()='return']//text()")

注意:由于没有文本直接来自return元素,因此我在您的XPath表达式(/)中添加了一个//text()