java - 在 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.
解决方案
你可以试试下面的:
@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}");
}
推荐阅读
- python-3.x - 在 Facebook BlenderBot 聊天机器人中训练和测试自定义数据集
- python - 如何在 Python 中使用多个键修改嵌套字典中的一组特定值?
- python - 带有数据库值的 WTForm SelectField
- mongodb - 使用 Logstash JDBC 插件同步 MongoDB 和 Elasticsearch 时避免重复
- sql - 使用 group by 在 SQL 中查找具有特定列值的列的总和
- python - 无法使用 Watson Assistant 获取 workspace_id
- java - 使用 JAVA 中的脚本创建一个反应应用程序
- python - What is the correct way to import modules when I'm writing my own module in python?
- selenium - Testcontainers Selenium 如何更新浏览器?
- python-3.x - 我想编写一个接受数字作为字符串的代码