php解析xml

项目中会遇到xml接口对接

xml请求

  • xml参数封装
1
2
3
4
5
6
7
8
9
10
11
12
//表单
$item .='<item>
<BUKRS>'.$v['bukrs'].'</BUKRS>
<WERKS>'.$v['shop_id'].'</WERKS>
<RECNNR>'.$v['recnnr'].'</RECNNR>
<CONDTYPE>'.$zk_conds.'</CONDTYPE>
<UNITPRICE>'.abs($amount).'</UNITPRICE>
<BEGDA>'.$getData['time'].'</BEGDA>
<ENDDA>'.$getData['time'].'</ENDDA>
<ZPYMTMETH></ZPYMTMETH>
<REMARK>'.$v['remark'].'</REMARK>
</item>' ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//表头	
$resques =
'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:sap-com:document:sap:rfc:functions">
<soapenv:Header/>
<soapenv:Body>
<urn:ZTRE_DEDUCT_CREATE>
<!--Optional:-->
<BUKRS>'.array_unique(array_column($data, 'bukrs'))[0].'</BUKRS>
<!--Optional:-->
<WERKS>'.array_unique(array_column($data, 'shop_id'))[0].'</WERKS>
<!--Optional:-->
<REMARK>'.$getData['remark'].'</REMARK>
<!--Optional:-->
<CRTUSR>'.$getData['job_no'].'</CRTUSR>
<!--Optional:-->
<ITAB>
<!--Zero or more repetitions:-->'
.$item.
'
</ITAB>
</urn:ZTRE_DEDUCT_CREATE>
</soapenv:Body>
</soapenv:Envelope>';
  • 参数请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* 请求接口
*
* @param string $xml xml参数
* @param string $url 接口地址
* @param string $action uri
* @param string $account 账号
* @param string $password 密码
* @return [type] [description]
*/
public function doSapXmlData($xml,$url,$action,$account='',$password=''){
$account = !$account?$this->account:$account;
$password = !$password?$this->password:$password;
//获取soap对象
$obj = new \SoapClient(null,array(
'location' =>$url,
'uri' =>$url,
'login'=> $account,
'password'=> $password));
//发送请求
$data = $obj->__doRequest($xml,config('sapPosData.action_data'),config('sapPosData.version'),1,0);
// writeLog($data,Config('LOG_PATH').'async/','xml_request');
return $data;
}

请求完成后返回参数应该是个对象

处理返回结果

  • 解析表头
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$domDocument = new \DOMDocument;
$domDocument->loadXML($resquesData);
$xml_node = $domDocument->getElementsByTagName("ZTRE_DEDUCT_CREATEResponse")->item(0);
foreach ($xml_node->childNodes as $kk => $vv) {
if($vv->nodeName=='ITAB'){
if($vv->childNodes->length>0){
foreach($vv->childNodes as $k => $v){
if($v->childNodes->length>0){
foreach ($v->childNodes as $key => $value) {
$resp[$vv->nodeName][$k][$value->nodeName] = $value->nodeValue;
}
}else{
$resp[$vv->nodeName] = $vv->nodeValue;
}
}
}else{
$resp[$vv->nodeName] = $vv->nodeValue;
}
}else{
$resp[$vv->nodeName] = $vv->nodeValue;
}
}
if (empty($resp)) throw new \Exception("请求异常", 1);
  • 解析表单
1
2
$xml_obj = simplexml_load_string($data);
$resp = json_decode(json_encode($xml_obj->xpath("//ITAB/item")),true);

结果就是$resp;

谢谢您请我喝咖啡!