好的我在砖墙上...所以我正在向php中的web服务成功请求,我可以捕获响应并使用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><WEB><LOANDETAIL><acctrefno>31415</acctrefno><master_acctrefno>0</master_acctrefno><loan_number>TEST100001</loan_number><name>HILL ALAN</name><shortname>ALAN HILL</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>
</GetLoanDetailResponse>
</soap:Body>
</soap:Envelope>
使用:echo&#34; RESPONSE:\ n&#34; 。 htmlentities(str_ireplace(&#39;&gt;&lt;&#39;,&#34;&gt; \ n&lt;&#34;,$ soapClient-&gt; __ getLastResponse()))。 &#34; \ n&#34 ;;
我试过simplexml_load_string() will not read soap response with "soap:" in the tags
和
How to drill into SOAP Namespaces with SimpleXML & PHP
再次尝试How to convert SOAP response to PHP Array?
我可以在堆栈溢出和php.net / google上找到每件事。我一直在看一个错误https://bugs.php.net/bug.php?id=48966的引用,我现在试图用它来解决这个问题...我真的不想使用dom似乎应该只有一个php才能读取这个响应...它是奇怪,当我打电话给$ soapClient-&gt; __ 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>
我还没能爆炸到阵列......
当我用jsonencode / decode尝试任何东西时,请注意GetLoanDetailResult我得到一个带有这个值的键,并且用非分隔字符串中的其余数据刺痛......
结束 GOAL 是将其放入数组中,以便我可以提取值并使用它们来填充新变量的参数。
在ubuntu服务器上使用php7.0
在How to convert SOAP response to PHP Array?
之后与响应互动的代码$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
(
)
答案 0 :(得分:1)
这会做你想要的吗? (一起来自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"
}]
}]
}]
}
答案 1 :(得分:1)
因此,使用此处Parse text between 2 words中的函数,这似乎是一种常见的方法来搜索我在响应中关注的每个参数,并获得完整的值而无需解决所有控制字符。
$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, '<acctrefno>', '</acctrefno>');
if(is_string($haystack)){
//echo $haystack;
echo 'LoanNumber should be here: ' . $parsed;
}else {
echo 'its not a string';
}
} catch (SoapFault $fault) {
$error = 1;
}