У меня есть XML-ответ, из которого я пытаюсь извлечь отдельный элемент, вот ответ:
<GetProductStockResponse>
<GetProductStockResult>
<ProductStock>
<Product>
<sku>AA-HF461</sku>
<stock>23</stock>
</Product>
</ProductStock>
</GetProductStockResult>
</GetProductStockResponse>
Если я повторяю это на экране, отображается как:
AA-HF461 23
Я попытался использовать simplexml_load_string, но он не работает, ничего не выходит:
$res = $soapClient->GetProductStock($q_param);
$clfResponse = $res->GetProductStockResult;
echo $clfResponse; // This works - see above
$xml = simplexml_load_string($clfResponse);
echo $xml; // This is empty
echo $xml->stock; // This is empty
Я делаю ошибку школьника?
echo $xml
напечатает строковое значение внешнего тега вашего XML. Так как GetProductStockResponse
не имеет текстового содержимого, нет вывода. Если вы хотите вывести полный XML в виде строки, используйте
echo $xml->asXML();
echo $xml->stock;
также будет пустым, так как внешний элемент не содержит <stock>
тег. Если вы хотите углубиться в это, вам нужно получить к нему доступ через каждый уровень документа:
echo (int) $xml->GetProductStockResult->ProductStock->Product->stock; // 23
(Типы передачи важны при работе с элементами SimpleXML, см. этот ответ Больше подробностей)
Если вы хотите иметь доступ к элементам с любого уровня документа, вы можете использовать SimpleXML xpath
метод, как это:
echo (int) $xml->xpath('//stock')[0]; // 23
Это напечатает первый <stock>
элемент любого уровня документа, но в целом лучше ориентироваться в документе в соответствии с его структурой.
Наконец, если вы тестируете это через браузер, помните, что элементы XML не будут отображаться правильно, если вы не экранируете вывод:
echo htmlspecialchars($xml->asXML());
Других решений пока нет …