разбор XML-ответа SOAP с помощью php

Я проверил несколько примеров и учебник w3Schools, но не могу понять структуру ответа SOAP. Я больше не прикасаюсь к php / xml более 10 лет, поэтому вы можете считать меня новичком.

Вот пример ответа, который я получаю

<DataSet xmlns="http://www.multiprets.net/api"> <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet"> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Table"> <xs:complexType> <xs:sequence> <xs:element name="ProductSequence" type="xs:string" minOccurs="0"/> <xs:element name="ProductCode" type="xs:string" minOccurs="0"/> <xs:element name="ProdNameEn" type="xs:string" minOccurs="0"/> <xs:element name="ProdNameFr" type="xs:string" minOccurs="0"/> <xs:element name="ProductTerm" type="xs:double" minOccurs="0"/> <xs:element name="UpdDate" type="xs:int" minOccurs="0"/> <xs:element name="UpdTime" type="xs:int" minOccurs="0"/> <xs:element name="Posted" type="xs:double" minOccurs="0"/> <xs:element name="MPH" type="xs:double" minOccurs="0"/> <xs:element name="CNT" type="xs:int" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> <NewDataSet xmlns=""> <Table diffgr:id="Table1" msdata:rowOrder="0"> <ProductSequence>A1999</ProductSequence> <ProductCode>VC</ProductCode> <ProdNameEn>3 years variable</ProdNameEn> <ProdNameFr>3 ans variable</ProdNameFr> <ProductTerm>3</ProductTerm> <UpdDate>20140529</UpdDate> <UpdTime>134900</UpdTime> <Posted>3</Posted> <MPH>3</MPH> <CNT>1</CNT> </Table> <Table diffgr:id="Table2" msdata:rowOrder="1"> <ProductSequence>A4000</ProductSequence> <ProductCode>VC</ProductCode> <ProdNameEn>5 years variable</ProdNameEn> <ProdNameFr>5 ans variable</ProdNameFr> <ProductTerm>5</ProductTerm> <UpdDate>20141021</UpdDate> <UpdTime>103100</UpdTime> <Posted>3</Posted> <MPH>2.3</MPH> <CNT>1</CNT> </Table> 

Я попытался получить <MPH> из table8 используя этот код:

 $client = new soapclient("http://www.multiprets.net/api/ws/services.asmx?wsdl"); $objectresult = $client->Recupere_meilleurs_Taux(array('Code_businessID'=> '**LoginString**','trace' => 1)); $resultat = simplexml_load_string($objectresult->Recupere_meilleurs_TauxResult->any); foreach ($resultat->xpath('//Table[@id='Table8']') as $product){ echo $product->MPH."< br/ >"; } 

Безрезультатно, поскольку он не возвращает никакого результата. Если я удалю атрибут из xpath и сохраняю только //Table я получаю MPH из всей таблицы, поэтому я уверен, что это что-то с атрибутом @id

Заранее благодарю вас за ваше время и за обмен знаниями.

Проблема здесь в том, что ваш атрибут имеет пространство имен, поэтому вам нужно зарегистрировать ns с помощью SimpleXML XPath и использовать его в запросе XPath.

Этот элемент объявляет два пространства имен для своих потомков:

 <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 

Чтобы зарегистрировать эти пространства имен с помощью SimpleXML, вам необходимо использовать функцию registerXPathNamespace . В зависимости от того, какие другие запросы вы выполняете, вы можете захотеть зарегистрировать оба пространства имен. Для вашего запроса вам понадобится пространство urn:schemas-microsoft-com:xml-diffgram-v1 ( diffgr ); зарегистрируйте его так:

 $sxe = new SimpleXMLElement($your_xml_here); $sxe->registerXPathNamespace('d', 'urn:schemas-microsoft-com:xml-diffgram-v1'); 

Теперь вы можете получить доступ к любому элементу или атрибуту в пространстве имен diffgr его буквой d . Вот пример использования элемента Table с идентификатором Table1 :

 $tables = $sxe->xpath('//Table[@d:id="Table1"]'); foreach ($tables as $t) { echo $t->ProductSequence . PHP_EOL; } 

Вывод:

 A1999 
 retrieve value from this type response <?xml version="1.0" encoding="utf-8"?> <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> <xyzResponse xmlns="http://tempuri.org/"> <xyzResult> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Table"> <xs:complexType> <xs:sequence> <xs:element name="myCityID" type="xs:int" minOccurs="0" /> <xs:element name="myCityName" type="xs:string" minOccurs="0" /> <xs:element name="myLat" type="xs:double" minOccurs="0" /> <xs:element name="myLon" type="xs:double" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> <NewDataSet xmlns=""> <Table diffgr:id="Table1" msdata:rowOrder="0"> <CityID>1</CityID> <CityName>Ahmedabad</CityName> <Lat>23.045839</Lat> <Lon>72.550578</Lon> </Table> <Table diffgr:id="Table2" msdata:rowOrder="1"> <CityID>21</CityID> <CityName>Amritsar</CityName> <Lat>31.705603</Lat> <Lon>74.807337</Lon> </Table> </NewDataSet> </diffgr:diffgram> </xyzResult> </xyzResponse> </soap:Body> </soap:Envelope> 

используя этот код, вы можете легко получить все данные Таблиц в переменной $ title и использовать это, вы можете легко легко получить любое конкретное значение …

  $sxe = new SimpleXMLElement($response); $sxe->registerXPathNamespace('d', 'urn:schemas-microsoft-com:xml-diffgram-v1'); $result = $sxe->xpath("//NewDataSet"); echo "<pre>"; //print_r($result[0]); foreach ($result[0] as $title) { print_r($title); }