[英]parsing SOAP XML response with php
我已經檢查了多個示例和w3Schools教程,但無法弄清楚SOAP響應的結構。 我已經十多年沒有接觸php / xml了,所以您可以考慮將我視為初學者。
這是我得到的回應的樣本
<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>
我試圖使用以下代碼從table8
獲取<MPH>
標記:
$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
,那么我將從所有//Table
獲取MPH
,因此我可以肯定它帶有@id
屬性
預先感謝您抽出寶貴的時間並分享您的知識。
這里的問題是您的屬性具有名稱空間,因此您需要向SimpleXML XPath注冊ns並在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
作為前綴來訪問任何元素或屬性。 這是一個使用ID為Table1
的Table
元素的示例:
$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變量中的所有Tables數據,並可以輕松輕松獲取任何特定值...
$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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.