#php #xml #soap
#php #xml #soap
Вопрос:
Я пытаюсь извлечь строковое значение из ответа soap, но я продолжаю получать объект обратно, независимо от того, что я пытаюсь. Я перепробовал все решения, которые нашел в StackO. Я либо получаю объект обратно, либо значение null.
Я хочу, чтобы значение содержалось в элементе «line». В этом конкретном ответе будет возвращен только 1 элемент «line».
$adapterResponse = simplexml_load_string($response);
$Line = $adapterResponse ->xpath('line');
пример XML:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns1:executeProcessResponse xmlns:ns1="http://bmc.com/ao/xsd/2008/09/soa">
<ns1:Output>
<ns1:Output ns1:type="xs:anyType">
<ns1:Parameter>
<ns1:Name>XML_Output</ns1:Name>
<ns1:Value ns1:type="xs:anyType">
<ns1:XmlDoc>
<XML_Output>
**<line>INVALID</line>**
</XML_Output>
</ns1:XmlDoc>
</ns1:Value>
</ns1:Parameter>
</ns1:Output>
</ns1:Output>
</ns1:executeProcessResponse>
Ответ №1:
Проблема выглядит так, как будто выражение XPath ищет <line>
элемент в неправильном месте. line
будет просто искать элемент в текущем узле, если вместо этого вы используете //line
, это говорит о поиске узла в любом месте текущего узла…
$Line = $adapterResponse ->xpath('//line');
Итак, если вы затем сделаете
print_r($Line);
вы получите
Array
(
[0] => SimpleXMLElement Object
(
[0] => INVALID
)
)
Ответ №2:
Вы можете преобразовать ответ SOAP в массив и получить доступ к элементам массива, что вам требуется
$response = '<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns1:executeProcessResponse xmlns:ns1="http://bmc.com/ao/xsd/2008/09/soa">
<ns1:Output>
<ns1:Output ns1:type="xs:anyType">
<ns1:Parameter>
<ns1:Name>XML_Output</ns1:Name>
<ns1:Value ns1:type="xs:anyType">
<ns1:XmlDoc>
<XML_Output>
**<line>INVALID</line>**
</XML_Output>
</ns1:XmlDoc>
</ns1:Value>
</ns1:Parameter>
</ns1:Output>
</ns1:Output>
</ns1:executeProcessResponse>
</S:Body>
</S:Envelope>';
$xmlparser = xml_parser_create();
xml_parse_into_struct($xmlparser,$response,$values);
xml_parser_free($xmlparser);
echo '<pre>';
print_r($values);
Результат, подобный :-
Array
(
[0] => Array
(
[tag] => S:ENVELOPE
[type] => open
[level] => 1
[attributes] => Array
(
[XMLNS:S] => http://schemas.xmlsoap.org/soap/envelope/
)
[value] =>
)
....
....
....