Я только что подключился к веб-службе с помощью SoapClient. Веб-служба возвращает информацию о транспортном средстве на основе определенного ввода, VIN транспортного средства. Моя переменная $result установлена равной выходным данным веб-службы; таким образом, var_dump ($result); выгружает всю информацию о транспортном средстве. Я с трудом его расшифровываю. Вот часть вывода, которую я получил для Audi VIN:
object(stdClass)#2 (14) {
["responseStatus"]=> object(stdClass)#3 (2) {
["responseCode"]=> string(10) "Successful"
["description"]=> string(10) "Successful"
}
["vinDescription"]=> object(stdClass)#4 (11) {
["WorldManufacturerIdentifier"]=> string(17) "Germany Audi Nsu "
}
}
Как я могу переформатировать вывод? Я хочу дергать за ниточки. Например, я хотел бы переформатировать вывод примера так, чтобы он выглядел так:
Ответ: Успешно
Мировой идентификатор производителя: Германия Audi Nsu
.
Вот мой код PHP (я пропустил свое имя пользователя и пароль для веб-службы):
<?php
$client = new SoapClient('http://services.chromedata.com/Description/7b?wsdl');
$account = ['number'=>"", 'secret'=>"", 'country'=>"US", 'language'=>"en"];
$vin = $_POST["b12"];
$result = $client->describeVehicle([
'accountInfo' => $account,
'vin' => $vin
]);
var_dump ($result);
?>___________________________________________________________________________
Обнаружен еще один контрольно-пропускной пункт. Кажется, что чем дальше я копаюсь в данных, тем сложнее становятся вызывающие данные для создания новых переменных. Я пытаюсь извлечь Audi S4, 5 Door Wagon и All Wheel Drive.
Вот раздел, с которым я борюсь:
["technicalSpecification"]=>
array(97) {
[0]=>
object(stdClass)#640 (2) {
["titleId"]=>
int(1)
["value"]=>
array(2) {
[0]=>
object(stdClass)#641 (3) {
["styleId"]=>
array(2) {
[0]=>
int(292015)
[1]=>
int(292016)
}
["value"]=>
string(7) "Audi S4"
["condition"]=>
string(3) "-PT"
}
[1]=>
object(stdClass)#642 (3) {
["styleId"]=>
array(2) {
[0]=>
int(292015)
[1]=>
int(292016)
}
["value"]=>
string(7) "Audi S4"
["condition"]=>
string(0) ""
}
}
}
[1]=>
object(stdClass)#643 (2) {
["titleId"]=>
int(2)
["value"]=>
object(stdClass)#644 (3) {
["styleId"]=>
array(2) {
[0]=>
int(292015)
[1]=>
int(292016)
}
["value"]=>
string(12) "5 Door Wagon"
["condition"]=>
string(0) ""
}
}
[2]=>
object(stdClass)#645 (2) {
["titleId"]=>
int(6)
["value"]=>
object(stdClass)#646 (3) {
["styleId"]=>
array(2) {
[0]=>
int(292015)
[1]=>
int(292016)
}
["value"]=>
string(15) "All-Wheel Drive"
["condition"]=>
string(0) ""
}
}
___________________________________________________________________________
Добавляя:
$resultxml = htmlentities($client->__getLastResponse()) . "\n";
echo $resultxml;
Я могу получить вывод в XML. Вот данные, которые я пытаюсь использовать для формирования переменных:
<technicalSpecification>
<titleId>1</titleId>
<value value = "Audi S4" condition = "-PT">
<styleId>292015</styleId>
<styleId>292016</styleId>
</value>
<value value = "Audi S4" condition = "">
<styleId>292015</styleId>
<styleId>292016</styleId>
</value>
</technicalSpecification>
<technicalSpecification>
<titleId>2</titleId>
<value value = "5 Door Wagon" condition = "">
<styleId>292015</styleId>
<styleId>292016</styleId>
</value>
</technicalSpecification>
<technicalSpecification>
<titleId>6</titleId>
<value value = "All-Wheel Drive" condition = "">
<styleId>292015</styleId>
<styleId>292016</styleId>
</value>
</technicalSpecification>






Использование var_dump обычно позволяет программисту легко проверить результат определенных значений, как то, что вы сделали. Однако в вашем случае, если вы очень уверены в результате возврата структура данных, я предлагаю вам переформатировать результат, напрямую распечатав желаемые данные:
Демонстрационный скрипт с неверным доступом к значениям:
<?php
$client = new SoapClient('http://services.chromedata.com/Description/7b?wsdl');
$account = ['number'=>"", 'secret'=>"", 'country'=>"US", 'language'=>"en"];
$vin = $_POST["b12"];
$result = $client->describeVehicle([
'accountInfo' => $account,
'vin' => $vin
]);
if (property_exists($result, 'responseCode') && property_exists($result,'WorldManufacturerIdentifier')){
echo "Response : ".$result['responseStatus']['responseCode']."<br>World Manufacturer Id : ".$result['vinDescription']['WorldManufacturerIdentifier']."<br>";
}else{
echo "The returned data is not complete!"; //or other proper error messages
}
?>
Отредактированный правильный сценарий находится здесь:
<?php
$client = new SoapClient('http://services.chromedata.com/Description/7b?wsdl');
$account = ['number'=>"", 'secret'=>"", 'country'=>"US", 'language'=>"en"];
$vin = $_POST["b12"];
$result = $client->describeVehicle([
'accountInfo' => $account,
'vin' => $vin
]);
if (property_exists($result, 'responseCode') &&
property_exists($result,'WorldManufacturerIdentifier')){
echo "Response : ".$result->responseStatus->responseCode."<br>World Manufacturer Id : ".$result->vinDescription->WorldManufacturerIdentifier."<br>";
}else{
echo "The returned data is not complete!"; //or other proper error messages
}
?>
Для последней части XML вы должны добавить дополнительные теги сворачивать вокруг результата XML, прежде чем загружать его вручную. Использование getElementsByTagName () и getAttribute позволяет мне загрузить результат с помощью функции цикла:
<?php
$doc = new DOMDocument();
$doc->loadXML('<some><technicalSpecification><titleId>1</titleId><value
value = "Audi S4" condition = "-PT"><styleId>292015</styleId>
<styleId>292016</styleId></value><value value = "Audi S4" condition = "">
<styleId>292015</styleId><styleId>292016</styleId></value>
</technicalSpecification><technicalSpecification><titleId>2</titleId><value
value = "5 Door Wagon" condition = ""><styleId>292015</styleId>
<styleId>292016</styleId></value></technicalSpecification>
<technicalSpecification><titleId>6</titleId><value value = "All-Wheel Drive"
condition = ""><styleId>292015</styleId><styleId>292016</styleId></value>
</technicalSpecification></some>');
$childs = $doc->getElementsByTagName("technicalSpecification");
foreach($childs as $child){
$value = $child->getElementsByTagName("value")[0]->getAttribute("value");
echo $value;
}
@mugelloblue Могу ли я узнать сообщение об ошибке вывода, когда ошибка произошла?
Я переформатировал полученные вами данные, чтобы было понятнее, как получить нужные данные. Попробуйте $result->vinDescription->WorldManufacturerIdentifier или $result['vinDescription']['WorldManufacturerIdentifier'].
@mugelloblue Как и упомянул Грег, я пропустил взгляд на структуру данных и отредактировал ответ, структура данных должна быть $result[vinDescription'']['WorldManufacturerIdentifier'], а не просто $result['WorldManufacturerIdentifier']
@GregSchmidt @gitguddog Большое спасибо за ваши дополнения. Да, именно структура данных доставляла мне трудности. Кажется, $result->vinDescription->WorldManufacturerIdentifier отлично называет данные. Пока $result['vinDescription']['WorldManufacturerIdentifier'] не может вызвать данные. Есть идеи, почему одно будет преобладать над другим? Кажется, это одно и то же утверждение?
@mugelloblue Есть разница в доступе к множество или объект с помощью скобки или обозначения стрелок. Вы можете обратиться к этому вопрос, чтобы получить более ясное представление о доступе к значению. Между прочим, Грег отлично поработал)
@gitguddoge аааа да ссылка на объект и ссылка на массив. Спасибо!
@mugelloblue добро пожаловать, я тоже кое-что узнал :) буду редактировать ответ, хотя
@GregSchmidt @gitguddoge Я прорабатываю данные и наткнулся на часть, которую изо всех сил пытаюсь вызвать. Я пытаюсь извлечь 3 строки Audi S4, 5 Door Wagon и All-Wheel Drive. Я отредактировал вопрос, чтобы включить это. Любая помощь снова будет очень признательна.
Отступы в ваших данных представляют собой беспорядок, из-за чего кому-либо, включая меня и, предположительно, вас, трудно понять, какова реальная структура. Вы использовали предложение <pre> от @NorielleCruz?
@mugelloblue, как упомянул Грег, не могли бы вы использовать <pre> для форматирования результата? Нам сложно так смотреть на структуру
@GregSchmidt @gitguddoge Я немного обновил начало, но именно так оно отформатировано с помощью <pre>. С тех пор, как @NorielleCruz порекомендовал, я использую <pre>. Также добавлены скриншоты вывода. Есть предположения?
@mugelloblue Я бы посоветовал вам использовать Итерация объекта, где концепция состоит в том, чтобы пройти через многомерный массив / объект, вы можете сначала попробовать уровень за уровнем, чтобы проверить значение для текущего уровня, прежде чем двигаться дальше
@mugelloblue, скажем, для первого уровня вы можете попробовать for($result as $k1 => $v1){print_r($v1);}, и после того, как вы узнаете, что есть еще один уровень для $v1 во время цикла, вы можете добавить еще один уровень, где что-то вроде for($result as $k1 => $v1){for($v1 as $k2 => $v2){print_r($v2);}}, и на всякий случай, если вы испортили вещь $value, вы всегда можете использовать $result[$k1] на замену $v1
@gitguddoge Я проверю, спасибо! Вывод очень простой в XML, возможно, я могу просто изменить вывод $Result на XML и попытаться получить данные прямо оттуда.
@mugelloblue, если возвращаемый результат подтвержден в формате xml с использованием loadXML () из DOMDocument, намного лучше
@gitguddoge Я только что добавил вывод XML и как я добрался до сути вопроса. Вы бы назвали эти данные аналогичным образом? Что-то вроде $resultxml->$technicalSpecifications->and so on? Я проверю эту ссылку сейчас, спасибо!
@mugelloblue посмотри, так как я могу получить значение
@gitguddoge По-прежнему не может получить значение от DomDocument
Попробуйте отобразить элемент html предварительно над ним, он должен выглядеть так:
<?php
$client = new SoapClient('http://services.chromedata.com/Description/7b?wsdl');
$account = ['number'=>"", 'secret'=>"", 'country'=>"US", 'language'=>"en"];
$vin = $_POST["b12"];
$result = $client->describeVehicle([
'accountInfo' => $account,
'vin' => $vin
]);
echo "<pre>";
var_dump ($result);
echo "</pre>"; // optional
?>
В качестве альтернативы используйте вместо этого print_r ().
Я попытался вызвать определенные переменные, используя аналогичный код:
echo $result['WorldManufacturerIdentifier'];. Однако эта команда не была распознана.