如何使用PHP simplexml_load_string解析此SOAP XML响应?

时间:2014-03-31 15:38:22

标签: php xml soap

我担心如何使用命名空间和前缀解析此XML。这是我从Curl请求获得的SOAP回复:

<soap:envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:body>
    <getproductpricekonfigurationresponse xmlns="https://service.printapi.de/interface/">
      <getproductpricekonfigurationresult>
        <xs:schema id="ProduktPreisKonfiguration" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"></xs:schema>
        <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
          <produktpreiskonfiguration xmlns>
            <produktkonfiguration diffgr:id="ProduktKonfiguration1" msdata:roworder="0" diffgr:haschanges="inserted">
              <idobjekt>4</idobjekt>
              <idformat>30</idformat>
              <ustidentnr>
                <objektpreisnetto>18.77</objektpreisnetto>
                <mwstwert>6.01</mwstwert>
              </ustidentnr>
            </produktkonfiguration>
          </produktpreiskonfiguration>
        </diffgr:diffgram>
      </getproductpricekonfigurationresult>
    </getproductpricekonfigurationresponse>
  </soap:body>
</soap:envelope>

如果我想回应一下#34; objektpreisnetto&#34;节点,我该怎么做?

编辑:这是我尝试过的一些事情(其中包括):

$xml = simplexml_load_string($soap);

$result = $xml->children('http://schemas.xmlsoap.org/soap/envelope/')
    ->children('https://service.printapi.de/interface/')
    ->getproductpricekonfigurationresult
    ->objektpreisnetto;

echo $result->objektpreisnetto;

没有任何回报,但我确定我没有正确处理儿童部分。

这是我尝试的一个更基本的例子,它也没有返回任何内容:

$xml = simplexml_load_string($soap);
foreach ($xml->children('http://schemas.xmlsoap.org/soap/envelope/') as $child)
{
  echo "Child node: " . $child . "<br>";
}

这至少不会返回一个子节点吗?任何见解将不胜感激!

2 个答案:

答案 0 :(得分:1)

SoapClient通过在SoapClient选项中设置loginpassword来处理HTTP身份验证,您尝试过吗?

然后使用Wsdl到php生成器来帮助您获得您将用作类图的相应PHP类,尝试https://www.wsdltophp.com

因此,您只处理PHP对象,而您不必解析任何内容。

答案 1 :(得分:1)

我设法让这个工作!

首先,我使用curl登录并发送SOAP请求,如本答案中所述:https://stackoverflow.com/a/7157785/1121877

然后我按照此处概述的simplexml_load_string加载返回的XML:https://stackoverflow.com/a/8275835/1121877

感谢大家分享他们的知识!