解析SOAP Xml对PHP数组的响应

时间:2016-08-10 10:29:30

标签: php arrays json xml soap

object(stdClass)#2 (1) { ["GetExchangeRatesResult"]=> string(6183) " 149 2016-08-10T00:00:00+02:00 978 EUR ЕМУ 1 61.1876 61.4951 61.8026 EMU евро Euro 2016-08-09T00:00:00+02:00 149 2016-08-10T00:00:00+02:00 840 USD С А Д 1 55.2335 55.511 55.7886 USA САД долар US dollar 2016-08-09T00:00:00+02:00 149 2016-08-10T00:00:00+02:00 826 GBP В.Британија 1 71.6483 72.0083 72.3684 U.K. британска фунта British pound 2016-08-09T00:00:00+02:00 149 2016-08-10T00:00:00+02:00 756 CHF Швајцарија 1 56.1406 56.4227 56.7048 Switzerland швајцарски франк Swiss franc 2016-08-09T00:00:00+02:00 149 2016-08-10T00:00:00+02:00 752 SEK Шведска 1 6.4493 6.4817 6.5141 Sweden шведска круна Swedish krona 2016-08-09T00:00:00+02:00 149 2016-08-10T00:00:00+02:00 578 NOK Норвешка 1 6.5392 6.5721 6.605 Norway норвешка круна Norwegian krone 2016-08-09T00:00:00+02:00 149 2016-08-10T00:00:00+02:00 392 JPY Јапонија 1 0.5402 0.5429 0.5456 Japan јапонски јен Japanese yen 2016-08-09T00:00:00+02:00 149 2016-08-10T00:00:00+02:00 208 DKK Данска 1 8.2278 8.2691 8.3105 Denmark данска круна Danish krone 2016-08-09T00:00:00+02:00 149 2016-08-10T00:00:00+02:00 124 CAD Канада 1 42.0043 42.2153 42.4264 Canada канадски долар Canadian dollar 2016-08-09T00:00:00+02:00 149 2016-08-10T00:00:00+02:00 36 AUD Австралија 1 42.3063 42.5189 42.7315 Australia австралиски долар Australian dollar 2016-08-09T00:00:00+02:00 " }

我从SOAP请求中得到了上面的响应。但我无法将其解析为数组或至少是Json。

这是我尝试过的:

$xml = preg_replace(“/(<\/?)(\w+):([^>]*>)/”, “$1$2$3”, $xml);
$xml = simplexml_load_string($xml);
$json = json_encode($xml);
$responseArray = json_decode($json,true);

使用时:

function simpleXmlElement2array($xmlObject, $out = array()) {

    foreach ((array)$xmlObject as $index => $node) {
        $out[$index] = (is_object($node) || is_array($node)) ? self::SimpleXmlElement2array($node) : $node;
    }

    return $out;
}

我明白了:

Array
(
    [GetExchangeRatesResult] => 




























    149
    2016-08-10T00:00:00+02:00
    978
    EUR
    ЕМУ
    1
    61.1876
    61.4951
    61.8026
    EMU
    евро
    Euro
    2016-08-09T00:00:00+02:00


    149
    2016-08-10T00:00:00+02:00
    840
    USD
    С А Д
    1
    55.2335
    55.511
    55.7886
    USA
    САД долар
    US dollar
    2016-08-09T00:00:00+02:00


    149
    2016-08-10T00:00:00+02:00
    826
    GBP
    В.Британија
    1
    71.6483
    72.0083
    72.3684
    U.K.
    британска фунта
    British pound
    2016-08-09T00:00:00+02:00


    149
    2016-08-10T00:00:00+02:00
    756
    CHF
    Швајцарија
    1
    56.1406
    56.4227
    56.7048
    Switzerland
    швајцарски франк
    Swiss franc
    2016-08-09T00:00:00+02:00


    149
    2016-08-10T00:00:00+02:00
    752
    SEK
    Шведска
    1
    6.4493
    6.4817
    6.5141
    Sweden
    шведска круна
    Swedish krona
    2016-08-09T00:00:00+02:00


    149
    2016-08-10T00:00:00+02:00
    578
    NOK
    Норвешка
    1
    6.5392
    6.5721
    6.605
    Norway
    норвешка круна
    Norwegian krone
    2016-08-09T00:00:00+02:00


    149
    2016-08-10T00:00:00+02:00
    392
    JPY
    Јапонија
    1
    0.5402
    0.5429
    0.5456
    Japan
    јапонски јен
    Japanese yen
    2016-08-09T00:00:00+02:00


    149
    2016-08-10T00:00:00+02:00
    208
    DKK
    Данска
    1
    8.2278
    8.2691
    8.3105
    Denmark
    данска круна
    Danish krone
    2016-08-09T00:00:00+02:00


    149
    2016-08-10T00:00:00+02:00
    124
    CAD
    Канада
    1
    42.0043
    42.2153
    42.4264
    Canada
    канадски долар
    Canadian dollar
    2016-08-09T00:00:00+02:00


    149
    2016-08-10T00:00:00+02:00
    36
    AUD
    Австралија
    1
    42.3063
    42.5189
    42.7315
    Australia
    австралиски долар
    Australian dollar
    2016-08-09T00:00:00+02:00


)

我至少希望能够像$arr['12']

一样单独获取每件商品

1 个答案:

答案 0 :(得分:1)

很久以前我尝试过递归方法(适用于节点)。 我找到了我的旧代码,rmemeber递归受到限制(你可以在服务器设置中更改它):

public static function SimpleXmlElement2array($xmlObject, $out = array())
{
    foreach ((array)$xmlObject as $index => $node) {
        $out[$index] = (is_object($node) || is_array($node)) ? self::SimpleXmlElement2array($node) : $node;
    }

    return $out;
}

修改 好吧,我不明白你想做什么。 问题是数据无效。 当我从节点获取字符串值并尝试:

$temp = explode(' ',  trim($string));
print_r(array_chunk($temp, 13)); 

resluts无效。每次尝试爆炸或使用空格作为分隔符进行解析都会失败,因为部分840 USD С А Д应为840 USD САД

如果不是这种情况,你可以使用abodive代码。如果你得到这种具有不规则结构的响应,那么我不知道如何在没有硬编码的情况下解析它,使用正则表达式解析每个值。