【问题标题】:Nest XML soap response PHP嵌套 XML 肥皂响应 PHP
【发布时间】:2017-11-09 14:30:54
【问题描述】:

好的,我在砖墙...所以我成功地向 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>&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:\n" 完成。 htmlentities(str_ireplace('>\n__getLastResponse())) 。 "\n";

我试过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->__getLastResponse()) 我得到 ​​p>

<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
(
)

【问题讨论】:

  • 你的代码在哪里显示你在肥皂请求后做了什么?
  • 目前一直在变化(上传到底部?)
  • 你看到这个了吗? stackoverflow.com/questions/1505211/…
  • 没有运气让其中一项工作@mkaatman,但尝试
  • 我不知道你有什么,但通常看起来你得到了一个空数组。故障排除 101:转储上一个变量。 $xml,然后是 $response。继续跟踪它,直到你找到它在哪里坏了。

标签: php xml web-services soap response


【解决方案1】:

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

从你的$response = preg_replace("/(&lt;\/?)(\w+):([^&gt;]*&gt;)/", "$1$2$3", $soapClient-&gt;__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"
            }]
        }]
    }]
}

【讨论】:

  • 这个运气好吗?
  • 还没能实现..我很好奇我将如何遍历这个..我的猜测是$loanArray = xml2js($xml);
  • 然后回显 $loanArray[0][0][0] 等等
  • 所以我选择了另一种解决方案来使这项工作对我来说更容易一些。
【解决方案2】:

因此,使用此处找到的函数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, '&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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    相关资源
    最近更新 更多