在R语言中调用XML结构SOAP Web Service并提取目标数据
R语言SOAP WSDL节点提取及接口调用方案
前置依赖
首先安装并加载需要的工具包:
install.packages(c("httr", "xml2")) library(httr) library(xml2)
提取指定WSDL节点内容
你当前GET请求返回的是SOAP服务的WSDL定义文档,要提取第11、13、15行对应的响应消息节点,使用以下代码即可:
# 沿用你已有的连接代码 url <-"https://sigaf.hacienda.go.cr/sap/bc/srt/wsdl/flv_10002A111AD1/bndg_url/sap/bc/srt/rfc/sap/zfmg_reports/500/zfmg_reports/binding?sap-client=500" username <- "XXX" password <- "YYY" MH_1 <- GET(url, authenticate(username,password, type = "basic")) # 解析XML内容,指定编码消除警告 wsdl_doc <- content(MH_1, encoding = "UTF-8") # 注册命名空间 ns <- xml_ns_rename(xml_ns(wsdl_doc), d1 = "wsdl") # 方法1:按节点名称精准提取三个响应节点 target_nodes <- xml_find_all(wsdl_doc, ".//wsdl:message[contains(@name, 'Response')]", ns = ns) # 方法2:按你标注的节点位置直接提取 all_top_nodes <- xml_children(wsdl_doc) target_nodes <- all_top_nodes[c(11,13,15)] # 输出节点完整内容 print(target_nodes) # 提取节点的属性信息 node_info <- lapply(target_nodes, function(node){ list( 消息名称 = xml_attr(node, "name"), 关联元素 = xml_attr(xml_child(node, "part", ns = ns), "element") ) }) print(node_info)
调用SOAP接口获取实际业务数据
如果你需要获取对应接口的实际返回业务数据,需要构造SOAP请求报文调用对应接口,示例代码如下(以调用ZwsZfmMensual接口为例):
# 构造SOAP请求体,需根据WSDL中types定义的参数结构补充入参 soap_req <- '<?xml version="1.0" encoding="utf-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:sap-com:document:sap:rfc:functions"> <soapenv:Header/> <soapenv:Body> <urn:ZwsZfmMensual> <!-- 此处替换为接口要求的实际入参 --> <I_PERIODO>202110</I_PERIODO> </urn:ZwsZfmMensual> </soapenv:Body> </soapenv:Envelope>' # 发送POST请求调用接口 resp <- POST( # 接口地址可从WSDL的service节点中获取 url = "http://APP-SIGAF4.mh.hacienda.go.cr:8000/sap/bc/srt/rfc/sap/zfmg_reports/500/zfmg_reports/binding?sap-client=500", authenticate(username, password, type = "basic"), content_type("text/xml;charset=utf-8"), add_headers(SOAPAction = "urn:sap-com:document:sap:soap:functions:mc-style/ZwsZfmMensual"), body = soap_req ) # 解析返回的业务数据 business_xml <- content(resp, encoding = "UTF-8") print(business_xml)
内容的提问来源于stack exchange,提问作者Oscar CENTENO MORA
相关产品推荐
相关产品推荐

