PHP - оценка ответа SOAP и получение строкового значения из ответа - PullRequest
1 голос
/ 06 апреля 2019

Я пытаюсь получить строковое значение из мыльного ответа, но продолжаю возвращать объект, что бы я ни пытался.Я перепробовал каждое решение, которое нашел на StackO.Я либо получаю объект назад, либо нулевое значение.

Я хочу, чтобы значение содержалось в элементе "line".В этом конкретном ответе будет возвращен только 1 элемент строки.

$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>

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

Проблема выглядит так, как будто выражение XPath ищет элемент <line> в неправильном месте.line будет просто искать элемент в текущем узле, если вместо этого вы используете //line, это говорит о том, что нужно искать узел в любом месте текущего узла ...

$Line = $adapterResponse ->xpath('//line');

Так что если вы затем выполните

print_r($Line);

вы получите

Array
(
    [0] => SimpleXMLElement Object
        (
            [0] => INVALID
        )

)
0 голосов
/ 06 апреля 2019

Вы можете преобразовать свой 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] => 

    )
    ....
    ....
    ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...