Разбор XML-данных из PHP SOAP Response - PullRequest
0 голосов
/ 26 марта 2019

Мне удалось получить ответ от API, с которым я работаю, с помощью Брайана Дрисколла, но у меня возникли проблемы с анализом этих данных XML. Вот скрипт для получения ответа и возвращенных данных XML -

$clientC = new SoapClient('http://webservice.nada.com/vehicles/vehicle.asmx?wsdl',array('trace' => 1,'exceptions' => 1, 'cache_wsdl' => 0));

$params = new stdClass();
$params->Token = $token;
$params->Period = 1;
$params->VehicleType = "UsedCar";
$params->Vin = '5YFBURHE3FP331896';
$params->Region = 10;
$params->Mileage = 100;

$result = $clientC->getDefaultVehicleAndValueByVin(array('vehicleRequest' => $params));

$xml = htmlspecialchars($clientC->__getLastResponse());

Это возвращает -

<?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>
            <getDefaultVehicleAndValueByVinResponse xmlns="http://webservice.nada.com/">
                <getDefaultVehicleAndValueByVinResult>
                    <Uid>1182699</Uid>
                    <VehicleYear>2015</VehicleYear>
                    <MakeCode>47</MakeCode>
               </getDefaultVehicleAndValueByVinResult> 
           </getDefaultVehicleAndValueByVinResponse>
      </soap:Body>
    </soap:Envelope>

Я бы хотел проанализировать XML и получить что-то вроде

$vehicle_year = $xml->VehicleYear;

Я пытался -

$xml = htmlspecialchars($clientC->__getLastResponse());

$response = strtr($xml, ['</soap:' => '</', '<soap:' => '<']);
$output = json_decode(json_encode(simplexml_load_string($response)));
var_dump($output->Body->getHighVehicleAndValueByVinResponse->VehicleYear);

Но возвращает NULL

1 Ответ

1 голос
/ 26 марта 2019

Это обычная проблема наличия различных пространств имен, по которым вам нужно перемещаться. Корневой узел определяет xmlns:soap, так что вы можете использовать это без необходимости что-либо делать, поэтому XPath использует //soap:Body/* для поиска элемента внутри тега body, так как xpath() возвращает список совпадающих узлов, используйте [0] для просто выберите один из них.

Поскольку все основные данные находятся в пространстве имен по умолчанию (определенном как xmlns="http://webservice.nada.com/"), вы можете извлечь их все, используя $data->children("http://webservice.nada.com/"). Теперь это позволяет использовать стандартную запись объекта для доступа к значениям.

Следует отметить, что, хотя echo автоматически преобразует его в строку, если вы используете эти значения где-либо еще - вам может потребоваться преобразовать его, используя (string), поскольку элемент на самом деле является элементом SimpleXMLElement.

$data = <<< XML
<?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>
        <getDefaultVehicleAndValueByVinResponse xmlns="http://webservice.nada.com/">
            <getDefaultVehicleAndValueByVinResult>
            <Uid>1182699</Uid>
            <VehicleYear>2015</VehicleYear>
            <MakeCode>47</MakeCode>
            </getDefaultVehicleAndValueByVinResult> 
       </getDefaultVehicleAndValueByVinResponse>
    </soap:Body>
</soap:Envelope>
XML;

$xml = simplexml_load_string($data);
$data = $xml->xpath("//soap:Body/*")[0];
$details = $data->children("http://webservice.nada.com/");
echo (string)$details->getDefaultVehicleAndValueByVinResult->VehicleYear;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...