PHP — оценивает ответ SOAP и извлекает строковое значение из ответа

#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] => 

    )
    ....
    ....
    ....