Nest XML soap response PHP



好吧,我在一堵砖墙上...所以我在 php 中成功地向网络服务发出请求,我可以捕获响应并使用 php.net 能够以可读的形式输出结果/响应

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetLoanDetailResponse xmlns="http://vendorsite.com/">
<GetLoanDetailResult>&lt;WEB&gt;&lt;LOANDETAIL&gt;&lt;acctrefno&gt;31415&lt;/acctrefno&gt;&lt;master_acctrefno&gt;0&lt;/master_acctrefno&gt;&lt;loan_number&gt;TEST100001&lt;/loan_number&gt;&lt;name&gt;HILL ALAN&lt;/name&gt;&lt;shortname&gt;ALAN HILL&lt;/shortname&gt;&lt;current_payoff_balance&gt;14,358.83&lt;/current_payoff_balance&gt;&lt;curr_date&gt;07/14/2015&lt;/curr_date&gt;&lt;curr_maturity_date&gt;07/14/2021&lt;/curr_maturity_date&gt;&lt;interest_accrued_thru_date&gt;06/06/2017&lt;/interest_accrued_thru_date&gt;&lt;current_note_amount&gt;10,000.00&lt;/current_note_amount&gt;&lt;current_principal_balance&gt;10,000.00&lt;/current_principal_balance&gt;&lt;current_interest_balance&gt;4,358.83&lt;/current_interest_balance&gt;&lt;current_fees_balance&gt;0.00&lt;/current_fees_balance&gt;&lt;current_late_charge_balance&gt;0.00&lt;/current_late_charge_balance&gt;&lt;current_perdiem&gt;6.30&lt;/current_perdiem&gt;&lt;current_interest_rate&gt;23.00000&lt;/current_interest_rate&gt;&lt;total_past_due_balance&gt;5,651.05&lt;/total_past_due_balance&gt;&lt;total_current_due_balance&gt;5,651.05&lt;/total_current_due_balance&gt;&lt;next_billing_date&gt;06/18/2017&lt;/next_billing_date&gt;&lt;days_past_due&gt;662&lt;/days_past_due&gt;&lt;current_pending&gt;0&lt;/current_pending&gt;&lt;current_impound_balance&gt;0&lt;/current_impound_balance&gt;&lt;last_payment_date&gt;05/18/2017&lt;/last_payment_date&gt;&lt;last_payment_amount&gt;5&lt;/last_payment_amount&gt;&lt;status_code&gt;ACTIVE&lt;/status_code&gt;&lt;loan_type&gt;Term&lt;/loan_type&gt;&lt;open_date&gt;07/14/2015&lt;/open_date&gt;&lt;last_activity_date&gt;05/18/2017&lt;/last_activity_date&gt;&lt;current_udf1_balance&gt;0.00&lt;/current_udf1_balance&gt;&lt;current_udf2_balance&gt;0.00&lt;/current_udf2_balance&gt;&lt;current_udf3_balance&gt;0.00&lt;/current_udf3_balance&gt;&lt;current_udf4_balance&gt;0.00&lt;/current_udf4_balance&gt;&lt;current_udf5_balance&gt;0.00&lt;/current_udf5_balance&gt;&lt;current_udf6_balance&gt;0.00&lt;/current_udf6_balance&gt;&lt;current_udf7_balance&gt;0.00&lt;/current_udf7_balance&gt;&lt;current_udf8_balance&gt;0.00&lt;/current_udf8_balance&gt;&lt;current_udf9_balance&gt;0.00&lt;/current_udf9_balance&gt;&lt;current_udf10_balance&gt;0.00&lt;/current_udf10_balance&gt;&lt;current_suspense_balance&gt;0.00&lt;/current_suspense_balance&gt;&lt;interest_method&gt;SI&lt;/interest_method&gt;&lt;term_char&gt;Payments&lt;/term_char&gt;&lt;term&gt;72&lt;/term&gt;&lt;term_due&gt;72&lt;/term_due&gt;&lt;/LOANDETAIL&gt;&lt;/WEB&gt;</GetLoanDetailResult>
</GetLoanDetailResponse>
</soap:Body>
</soap:Envelope>

这是使用: echo "RESPONSE:" .htmlentities(str_ireplace('><', "><", $soapClient->__getLastResponse())) ."";

我已经尝试过simplexml_load_string()不会在标签中读取带有"soap:"的肥皂响应

如何使用 SimpleXML 和 PHP 深入了解 SOAP 命名空间

尝试如何将 SOAP 响应转换为 PHP 数组?

以及我在堆栈溢出和 php.net/谷歌上可以找到的每一件事。我一直看到对错误 https://bugs.php.net/bug.php?id=48966 的引用,我现在正试图使用它来解决这个问题......我真的不想使用 dom 似乎应该有一个 php 唯一的方法来阅读这个响应......奇怪的是,当我打电话给$soapClient->__getLastResponse())时,我得到

<WEB><LOANDETAIL><acctrefno>31415</acctrefno><master_acctrefno>0</master_acctrefno><loan_number>TEST100001</loan_number><name>Last Name F Name</name><shortname>Name</shortname><current_payoff_balance>14,358.83</current_payoff_balance><curr_date>07/14/2015</curr_date><curr_maturity_date>07/14/2021</curr_maturity_date><interest_accrued_thru_date>06/06/2017</interest_accrued_thru_date><current_note_amount>10,000.00</current_note_amount><current_principal_balance>10,000.00</current_principal_balance><current_interest_balance>4,358.83</current_interest_balance><current_fees_balance>0.00</current_fees_balance><current_late_charge_balance>0.00</current_late_charge_balance><current_perdiem>6.30</current_perdiem><current_interest_rate>23.00000</current_interest_rate><total_past_due_balance>5,651.05</total_past_due_balance><total_current_due_balance>5,651.05</total_current_due_balance><next_billing_date>06/18/2017</next_billing_date><days_past_due>662</days_past_due><current_pending>0</current_pending><current_impound_balance>0</current_impound_balance><last_payment_date>05/18/2017</last_payment_date><last_payment_amount>5</last_payment_amount><status_code>ACTIVE</status_code><loan_type>Term</loan_type><open_date>07/14/2015</open_date><last_activity_date>05/18/2017</last_activity_date><current_udf1_balance>0.00</current_udf1_balance><current_udf2_balance>0.00</current_udf2_balance><current_udf3_balance>0.00</current_udf3_balance><current_udf4_balance>0.00</current_udf4_balance><current_udf5_balance>0.00</current_udf5_balance><current_udf6_balance>0.00</current_udf6_balance><current_udf7_balance>0.00</current_udf7_balance><current_udf8_balance>0.00</current_udf8_balance><current_udf9_balance>0.00</current_udf9_balance><current_udf10_balance>0.00</current_udf10_balance><current_suspense_balance>0.00</current_suspense_balance><interest_method>SI</interest_method><term_char>Payments</term_char><term>72</term><term_due>72</term_due></LOANDETAIL></WEB>

我没能爆炸成阵列...

请注意 GetLoanDetailResult 当我尝试使用 jsonencode/decode 进行任何操作时,我得到了一个带有此值的键,并且对非分隔字符串中的其余数据进行了刺痛......

最终目标是将其放在数组中,以便我可以提取值并使用它们来填充新变量的参数。

在 ubuntu 服务器上使用 php7.0

之后与响应交互的代码 如何将 SOAP 响应转换为 PHP 数组?

$loanDetail = var_dump($loanUpdate);
$response = preg_replace("/(</?)(w+):([^>]*>)/", "$1$2$3", $soapClient->__getLastResponse());
$xml = new SimpleXMLElement($response);
$body = $xml->xpath('//SBody');
var_export($xml);
echo "======================<br />";
var_export($body);
echo "======================<br />";
$array = json_decode(json_encode((array)$body), TRUE); 
print_r($array);

返回

object(stdClass)#3 (1) {
["NLSGetLoanDetailResult"]=>
string(24) "7"
}
SimpleXMLElement::__set_state(array(
'soapBody' => 
SimpleXMLElement::__set_state(array(
'NLSGetLoanDetailResponse' => 
SimpleXMLElement::__set_state(array(
'NLSGetLoanDetailResult' => '7',
)),
)),
))======================
array (
)======================
Array
(
)

这会满足您的需求吗?(来自:https://stackoverflow.com/a/30733071/1207539)

从您的$response = preg_replace("/(</?)(w+):([^>]*>)/", "$1$2$3", $soapClient->__getLastResponse());开始

$response = '<WEB><LOANDETAIL><acctrefno>31415</acctrefno><master_acctrefno>0</master_acctrefno><loan_number>TEST100001</loan_number><name>Last Name F Name</name><shortname>Name</shortname><current_payoff_balance>14,358.83</current_payoff_balance><curr_date>07/14/2015</curr_date><curr_maturity_date>07/14/2021</curr_maturity_date><interest_accrued_thru_date>06/06/2017</interest_accrued_thru_date><current_note_amount>10,000.00</current_note_amount><current_principal_balance>10,000.00</current_principal_balance><current_interest_balance>4,358.83</current_interest_balance><current_fees_balance>0.00</current_fees_balance><current_late_charge_balance>0.00</current_late_charge_balance><current_perdiem>6.30</current_perdiem><current_interest_rate>23.00000</current_interest_rate><total_past_due_balance>5,651.05</total_past_due_balance><total_current_due_balance>5,651.05</total_current_due_balance><next_billing_date>06/18/2017</next_billing_date><days_past_due>662</days_past_due><current_pending>0</current_pending><current_impound_balance>0</current_impound_balance><last_payment_date>05/18/2017</last_payment_date><last_payment_amount>5</last_payment_amount><status_code>ACTIVE</status_code><loan_type>Term</loan_type><open_date>07/14/2015</open_date><last_activity_date>05/18/2017</last_activity_date><current_udf1_balance>0.00</current_udf1_balance><current_udf2_balance>0.00</current_udf2_balance><current_udf3_balance>0.00</current_udf3_balance><current_udf4_balance>0.00</current_udf4_balance><current_udf5_balance>0.00</current_udf5_balance><current_udf6_balance>0.00</current_udf6_balance><current_udf7_balance>0.00</current_udf7_balance><current_udf8_balance>0.00</current_udf8_balance><current_udf9_balance>0.00</current_udf9_balance><current_udf10_balance>0.00</current_udf10_balance><current_suspense_balance>0.00</current_suspense_balance><interest_method>SI</interest_method><term_char>Payments</term_char><term>72</term><term_due>72</term_due></LOANDETAIL></WEB>';
function xml2js($xmlnode) {
$root = (func_num_args() > 1 ? false : true);
$jsnode = array();
if (!$root) {
if (count($xmlnode->attributes()) > 0){
$jsnode["$"] = array();
foreach($xmlnode->attributes() as $key => $value)
$jsnode["$"][$key] = (string)$value;
}
$textcontent = trim((string)$xmlnode);
if (count($textcontent) > 0)
$jsnode["_"] = $textcontent;
foreach ($xmlnode->children() as $childxmlnode) {
$childname = $childxmlnode->getName();
if (!array_key_exists($childname, $jsnode))
$jsnode[$childname] = array();
array_push($jsnode[$childname], xml2js($childxmlnode, true));
}
return $jsnode;
} else {
$nodename = $xmlnode->getName();
$jsnode[$nodename] = array();
array_push($jsnode[$nodename], xml2js($xmlnode, true));
return json_encode($jsnode);
}
}

$xml = simplexml_load_string($response);
echo xml2js($xml);

收益 率:

{
"WEB": [{
"_": "",
"LOANDETAIL": [{
"_": "",
"acctrefno": [{
"_": "31415"
}],
"master_acctrefno": [{
"_": "0"
}],
"loan_number": [{
"_": "TEST100001"
}],
"name": [{
"_": "Last Name F Name"
}],
"shortname": [{
"_": "Name"
}],
"current_payoff_balance": [{
"_": "14,358.83"
}],
"curr_date": [{
"_": "07/14/2015"
}],
"curr_maturity_date": [{
"_": "07/14/2021"
}],
"interest_accrued_thru_date": [{
"_": "06/06/2017"
}],
"current_note_amount": [{
"_": "10,000.00"
}],
"current_principal_balance": [{
"_": "10,000.00"
}],
"current_interest_balance": [{
"_": "4,358.83"
}],
"current_fees_balance": [{
"_": "0.00"
}],
"current_late_charge_balance": [{
"_": "0.00"
}],
"current_perdiem": [{
"_": "6.30"
}],
"current_interest_rate": [{
"_": "23.00000"
}],
"total_past_due_balance": [{
"_": "5,651.05"
}],
"total_current_due_balance": [{
"_": "5,651.05"
}],
"next_billing_date": [{
"_": "06/18/2017"
}],
"days_past_due": [{
"_": "662"
}],
"current_pending": [{
"_": "0"
}],
"current_impound_balance": [{
"_": "0"
}],
"last_payment_date": [{
"_": "05/18/2017"
}],
"last_payment_amount": [{
"_": "5"
}],
"status_code": [{
"_": "ACTIVE"
}],
"loan_type": [{
"_": "Term"
}],
"open_date": [{
"_": "07/14/2015"
}],
"last_activity_date": [{
"_": "05/18/2017"
}],
"current_udf1_balance": [{
"_": "0.00"
}],
"current_udf2_balance": [{
"_": "0.00"
}],
"current_udf3_balance": [{
"_": "0.00"
}],
"current_udf4_balance": [{
"_": "0.00"
}],
"current_udf5_balance": [{
"_": "0.00"
}],
"current_udf6_balance": [{
"_": "0.00"
}],
"current_udf7_balance": [{
"_": "0.00"
}],
"current_udf8_balance": [{
"_": "0.00"
}],
"current_udf9_balance": [{
"_": "0.00"
}],
"current_udf10_balance": [{
"_": "0.00"
}],
"current_suspense_balance": [{
"_": "0.00"
}],
"interest_method": [{
"_": "SI"
}],
"term_char": [{
"_": "Payments"
}],
"term": [{
"_": "72"
}],
"term_due": [{
"_": "72"
}]
}]
}]
}

因此,使用此处找到的函数 在 2 个单词之间解析文本,这似乎是搜索我在响应中关心的每个参数并获得完整值的常用方法,而无需处理所有控制字符。

$loanUpdate = $soapClient->__call("METHOD", array($loan_param));
print "<pre>n";
echo "REQUEST:n" . str_ireplace('><', ">n<", $soapClient->__getLastRequest()) . "n"; //Print the Req to check it
echo "RESPONSE:n" . str_ireplace('><', ">n<", $soapClient->__getLastResponse()) . "n"; //Print the Resp to check it
print "</pre>n"; 
function get_string_between($string, $start, $end){
$string = ' ' . $string;
$ini = strpos($string, $start);
if ($ini == 0) return '';
$ini += strlen($start);
$len = strpos($string, $end, $ini) - $ini;
return substr($string, $ini, $len);
} //Function for all the info between tags
//$loanDetail = var_dump($loanUpdate);
$response = $soapClient->__getLastResponse();
$xml = new SimpleXMLElement($response);
$body = $xml->xpath('//SBody');
$haystack = str_ireplace('><', ">n<", $soapClient->__getLastResponse());

$parsed = get_string_between($haystack, '&lt;acctrefno&gt;', '&lt;/acctrefno&gt;');
if(is_string($haystack)){
//echo $haystack;
echo 'LoanNumber should be here: ' . $parsed; 
}else {
echo 'its not a string';
} 


} catch (SoapFault $fault) {
$error = 1;
}