После пребывания в течение НЕСКОЛЬКИХ разбитых часов на этом я прошу Вашу справку.
Я пытаюсь получить содержание конкретных узлов от ответа SOAP.
Ответ
http://www.w3.org/2003/05/soap-envelope"http://soap.xxxxxx.co.uk/">
24
The+client+order+number+3002254+is+already+in+use
1
Aborting
Я пытаюсь достигнуть узлы и детей
$XmlArray = new SimpleXMLElement($XmlStr);
foreach ($XmlArray->env:Envelope->env:Body->ns1:PlaceOrderResponse->ErrorArray->Error as $Error)
{
echo $Error->ErrorCode."
";
}
не работает. Я прочитал много статей такой как
и приблизительно 20 вопросов на этом сайте, которые, к сожалению, не помогают.
Даже запись,
$XmlArray = new SimpleXMLElement($XmlStr);
echo "
\n";
print_r($XmlArray);
echo "
\n";
дает
SimpleXMLElement Object
(
)
который заставляет меня задаться вопросом, является ли ответ мыла ($XmlStr) на самом деле допустимым входом для SimpleXMLElement.
Кажется что строка
$XmlArray = new SimpleXMLElement($XmlStr);
не делает то, к чему я ожидаю это.
Любая справка о том, как получить узлы от XML выше, очень приветствовалась бы.
Очевидно, получение этого работать (наличие рабочего примера) - то, в чем я нуждаюсь в ближайшей перспективе, но если кто-то мог бы помочь мне понять то, что я делаю, неправильно было бы лучше в долгосрочной перспективе.
Удачи. Stu
Вы должны использовать SimpleXMLElement::children()
, хотя на данном этапе, вероятно, было бы проще использовать XPath.
<?php
$XmlStr = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://soap.xxxxxx.co.uk/" >
<env:Body>
<ns1:PlaceOrderResponse>
<xxxxxOrderNumber></xxxxxOrderNumber>
<ErrorArray>
<Error>
<ErrorCode>24</ErrorCode>
<ErrorText>The+client+order+number+3002254+is+already+in+use</ErrorText>
</Error>
<Error>
<ErrorCode>1</ErrorCode>
<ErrorText>Aborting</ErrorText>
</Error>
</ErrorArray>
</ns1:PlaceOrderResponse>
</env:Body>
</env:Envelope>
XML;
$XmlArray = new SimpleXMLElement($XmlStr);
$t = $XmlArray->children("env", true)->Body->
children("ns1", true)->PlaceOrderResponse->
children()->ErrorArray->Error;
foreach ($t as $error) {
echo $error->ErrorCode, " " , $error->ErrorText, "<br />";
}
дает:
24 The+client+order+number+3002254+is+already+in+use 1 Aborting