I am a beginner at SOAP and have been trying to figure how to parse through XML response when I call the SOAP API.I have already tried similar questions like this on stackoverflow but somehow they are not working for me. I want to access Village and VillageName tag in a loop .
<dsVillages> <xs:schema id="dsVillages" targetNamespace="http://app.in/wsror/dsVillages.xsd" attributeFormDefault="qualified" elementFormDefault="qualified"> <xs:element name="dsVillages" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="VILLAGES"> <xs:complexType> <xs:sequence> <xs:element name="taluka" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="8"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="Village" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="8"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="VillageName" minOccurs="0"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="30"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <diffgr:diffgram> <dsVillages> <VILLAGES diffgr:id="VILLAGES1" msdata:rowOrder="0"> <taluka>0100</taluka> <Village>0192</Village> <VillageName>Adcol </VillageName> </VILLAGES> <VILLAGES diffgr:id="VILLAGES2" msdata:rowOrder="1"> <taluka>0100</taluka> <Village>1240</Village> <VillageName>Bando </VillageName> </VILLAGES> <VILLAGES diffgr:id="VILLAGES3" msdata:rowOrder="2"> <taluka>0100</taluka> <Village>0207</Village> <VillageName>Beto </VillageName> </VILLAGES> <VILLAGES diffgr:id="VILLAGES4" msdata:rowOrder="3"> <taluka>01006</taluka> <Village>0189</Village> <VillageName>Betqi </VillageName> </VILLAGES> </dsVillages> </diffgr:diffgram> </dsVillages>
I am using below code to get response from API’
$url = "http://test.asmx?wsdl"; $xml = '<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetAllVill xmlns="http://apps.in/wsror"> <strTaluka>code</strTaluka> <Username>username</Username> <Password>password</Password> </GetAllVill> </soap:Body> </soap:Envelope>'; $headers = array( "Content-type: text/xml", "Content-length: " . strlen($xml), "Connection: close", ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $data = curl_exec($ch);
I am able to access 1 value at a time if I use below method
$doc = new DOMDocument(); $doc->loadXML($data); echo $doc->getElementsByTagName('VillageName')->item(1)->nodeValue;
output for above method is :
Bando
I need to access Village and VillageName tag in a loop.
Advertisement
Answer
I have accessed the required tags using below method. Plz note i’m using option tag as these will be used as dropdown options
$VILLAGES = $doc->getElementsByTagName('VILLAGES'); foreach ($VILLAGES as $VILLAGE) { $VillageName = $VILLAGE->getElementsByTagName('VillageName')->item(0)->nodeValue; $Village = $VILLAGE->getElementsByTagName('Village')->item(0)->nodeValue; // $id = $VILLAGE->getElementsByTagName('taluka')->item(0)->nodeValue; echo '<option value="'.htmlentities($Village, ENT_QUOTES, "UTF-8").'" >'.htmlentities($VillageName, ENT_QUOTES, "UTF-8").'</option> '; }