Как прочитать ответ мыла от веб-служб UPS?

Я пытаюсь разобрать пример кода ИБП для службы рейтинга, и, хотя я получаю ответ от ИБП, я не могу ничего с этим поделать. Как мне прочитать и найти нужные данные? например

<rate:RatedShipment><rate:Service><rate:Code>03</rate:Code>

а также

<rate:TotalCharges>
<rate:CurrencyCode>USD</rate:CurrencyCode>
<rate:MonetaryValue>126.72</rate:MonetaryValue>
</rate:TotalCharges>

Мне нужен этот код и общие расходы.
Мой код до сих пор выглядит так:

        $result = $client->__soapCall($operation ,array($this->processRate()));
$resp = $client->__getLastResponse() ;
echo $resp ;

выход:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header />
<soapenv:Body>
<rate:RateResponse xmlns:rate="http://www.ups.com/XMLSchema/XOLTWS/Rate/v1.1">
<common:Response xmlns:common="http://www.ups.com/XMLSchema/XOLTWS/Common/v1.0">
<common:ResponseStatus>
<common:Code>1</common:Code>
<common:Description>Success</common:Description>
</common:ResponseStatus>
<common:Alert>
<common:Code>110971</common:Code>
<common:Description>Your invoice may vary from the displayed reference rates</common:Description>
</common:Alert>
<common:Alert>
<common:Code>110920</common:Code>
<common:Description>Ship To Address Classification is changed from Residential to Commercial</common:Description>
</common:Alert>
<common:TransactionReference />
</common:Response>
<rate:RatedShipment>
<rate:Service>
<rate:Code>03</rate:Code>
<rate:Description />
</rate:Service>
<rate:RatedShipmentAlert>
<rate:Code>110971</rate:Code>
<rate:Description>Your invoice may vary from the displayed reference rates</rate:Description>
</rate:RatedShipmentAlert>
<rate:RatedShipmentAlert>
<rate:Code>110920</rate:Code>
<rate:Description>Ship To Address Classification is changed from Residential to Commercial</rate:Description>
</rate:RatedShipmentAlert>
<rate:BillingWeight>
<rate:UnitOfMeasurement>
<rate:Code>LBS</rate:Code>
<rate:Description>Pounds</rate:Description>
</rate:UnitOfMeasurement>
<rate:Weight>3.0</rate:Weight>
</rate:BillingWeight>
<rate:TransportationCharges>
<rate:CurrencyCode>USD</rate:CurrencyCode>
<rate:MonetaryValue>17.76</rate:MonetaryValue>
</rate:TransportationCharges>
<rate:ServiceOptionsCharges>
<rate:CurrencyCode>USD</rate:CurrencyCode>
<rate:MonetaryValue>0.00</rate:MonetaryValue>
</rate:ServiceOptionsCharges>
<rate:TotalCharges>
<rate:CurrencyCode>USD</rate:CurrencyCode>
<rate:MonetaryValue>17.76</rate:MonetaryValue>
</rate:TotalCharges>
</rate:RatedShipment>
......
</rate:RateResponse>
</soapenv:Body>
</soapenv:Envelope>

Затем я запускаю этот код на нем:

$xml = simplexml_load_string($resp);
\TYPO3\Flow\var_dump($xml  );

$json = json_encode($xml);
$xmlarray = json_decode($json,TRUE);

echo "\n".__FILE__.' '.__LINE__."   xmlarray   \n";
\TYPO3\Flow\var_dump($xmlarray);
die;

Это выводы

    <div class="Flow-Error-Debugger-VarDump Flow-Error-Debugger-VarDump-Floating">
<div class="Flow-Error-Debugger-VarDump-Top">
Flow Variable Dump
</div>
<div class="Flow-Error-Debugger-VarDump-Center">
<pre dir="ltr"><span class="debug-object debug-unregistered" title="00000000366333b30000000074e4ee7f">SimpleXMLElement</span><span class="debug-scope">prototype<a id="o00000000366333b30000000074e4ee7f"></a></span><span class="debug-ptype" title="unknown">object</span></pre>
</div>
</div>

/home/me/domains/shop.me.com/public_html/releases/20131219160416/Data/Temporary/Development/Cache/Code/Flow_Object_Classes/Shop_Shipping_UPSShippingHandler.php 336   xmlarray

<div class="Flow-Error-Debugger-VarDump Flow-Error-Debugger-VarDump-Floating">
<div class="Flow-Error-Debugger-VarDump-Top">
Flow Variable Dump
</div>
<div class="Flow-Error-Debugger-VarDump-Center">
<pre dir="ltr">array(empty)</pre>
</div>
</div>

Кажется мой simplexml_load_string($resp) звонок не работает.

ОБНОВИТЬ:
Спасибо инопланетянин. Вот как выглядит мой код сейчас — он еще не идеален, но вы поняли -:

                $result = $client->__soapCall($operation ,array($this->processRate()));
$resp =   $client->__getLastResponse() ;
$sxe = simplexml_load_string($resp);
$sxe->registerXPathNamespace('r', "http://www.ups.com/XMLSchema/XOLTWS/Rate/v1.1");
$codes = $sxe->xpath('//r:RatedShipment/r:Service/r:Code');

$mv = $sxe->xpath('//r:TotalCharges/r:MonetaryValue');
$indx=0;
$estimates = array();
foreach ($codes as $c) {
$temporaryEstimate = array();
$temporaryEstimate['estimateId'] = $this->getServiceTitleByCode($c->__toString());
$temporaryEstimate['estimatePrice'] = '$' .$mv[$indx];
$estimates[] = $temporaryEstimate;
$indx++;
}
return $estimates;

0

Решение

Нет необходимости выполнять преобразование в JSON и обратно (если вы не хотите, чтобы ваш компьютер работал!); Я загрузил XML-файл, который вы разместили, непосредственно в элемент SimpleXMLElement, а затем запросил его с помощью XPath:

$sxe = new SimpleXMLElement($resp);

Все элементы, которые вас интересуют, находятся в rate namespace, поэтому вам нужно зарегистрировать пространство имен, чтобы иметь возможность запрашивать его:

$sxe->registerXPathNamespace('r', "http://www.ups.com/XMLSchema/XOLTWS/Rate/v1.1");

Теперь мы можем обратиться ко всем rate: узлы в XML, используя сокращение r:,

Запрос для всех Code элементы под RatedShipment/Service в r Пространство имен:

$codes = $sxe->xpath('//r:RatedShipment/r:Service/r:Code');
foreach ($codes as $c) {
echo "code: $c" . PHP_EOL;
}

Выход:

code: 03

Найти общую стоимость доставки, которая находится под r:TotalCharges как r:MonetaryValue а также r:CurrencyCode:

# xpath returns an array; we want the first element of that array for both these
$curr = $sxe->xpath('//r:TotalCharges/r:CurrencyCode')[0];
$mv = $sxe->xpath('//r:TotalCharges/r:MonetaryValue')[0];
echo "total charges: $mv $curr ". PHP_EOL;

Выход:

total charges: 17.76 USD

Если вы не знакомы с XPath, обратитесь к документации PHP за дополнительной информацией о Реализация SimpleXML в XPath.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]