2013-04-09 41 views
9

मैं एक सोप सेवा करने के लिए एक अनुरोध भेजने के लिए cURL उपयोग कर रहा हूँ करने के लिए सोप XML प्रतिक्रिया परिवर्तित, मैं पैरामीटर युक्त एक्सएमएल पोस्ट शरीर में भेजने के लिए, जवाब में मैं प्राप्त करते हैं:एक PHP वस्तु या सरणी

वेब सेवा: http://lcbtestxmlv2.ivector.co.uk/soap/book.asmx?WSDL

<?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> 
      <SearchResponse xmlns="http://ivectorbookingxml/"> 
      <SearchResult> 
       <ReturnStatus> 
        <Success>true</Success> 
        <Exception /> 
       </ReturnStatus> 
       <SearchURL>http://www.lowcostholidays.fr/dl.aspx?p=0,8,5,0&amp;date=10/05/2013&amp;duration=15&amp;room1=2,1,0_5&amp;regionid=9</SearchURL> 
       <PropertyResults> 
        <PropertyResult> 
         <TotalProperties>215</TotalProperties> 
         <PropertyID>1795</PropertyID> 
         <PropertyName>Hotel Gaddis</PropertyName> 
         <Rating>3.0</Rating> 
         <Country>Egypte</Country> 
         <Resort>Louxor</Resort> 
         <Strapline>Cet établissement confortable propose un très bon service à un bon rapport qualité-prix. Cet hôtel de 6 étages compte 55 chambres et comprend une terrasse, une réception avec coffre-fort et ascenseur,</Strapline> 
         <Description>Cet établissement confortable propose un très bon service à un bon rapport qualité-prix. Cet hôtel de 6 étages compte 55 chambres et comprend une terrasse, une réception avec coffre-fort et ascenseur,...</Description> 
         <CMSBaseURL>http://lcbtestxml1.ivector.co.uk/content/DataObjects/Property/Image/</CMSBaseURL> 
         <MainImage>image_1795_v1.jpg</MainImage> 
         <MainImageThumbnail>imagethumb_1795_v1.jpg</MainImageThumbnail> 
         <SearchURL>http://www.lowcostholidays.fr/dl.aspx?p=0,8,5,0&amp;date=10/05/2013&amp;duration=15&amp;room1=2,1,0_5&amp;regionid=9&amp;propertyid=1795</SearchURL> 
         <RoomTypes> 
         <RoomType> 
          <Seq>1</Seq> 
          <PropertyRoomTypeID>690039000</PropertyRoomTypeID> 
          <MealBasisID>3</MealBasisID> 
          <RoomType>Twin/double Room</RoomType> 
          <RoomView /> 
          <MealBasis>Petit Déjeuner</MealBasis> 
          <NonRefundableRates>false</NonRefundableRates> 
          <SubTotal>150.58</SubTotal> 
          <Discount>0</Discount> 
          <Total>150.58</Total> 
          <Adults>2</Adults> 
          <Children>1</Children> 
          <Infants>0</Infants> 
          <Errata /> 
         </RoomType> 
         <RoomType> 
          <Seq>1</Seq> 
          <PropertyRoomTypeID>690039001</PropertyRoomTypeID> 
          <MealBasisID>7</MealBasisID> 
          <RoomType>Twin/double Room</RoomType> 
          <RoomView /> 
          <MealBasis>Demi-Pension</MealBasis> 
          <NonRefundableRates>false</NonRefundableRates> 
          <SubTotal>291.64</SubTotal> 
          <Discount>0</Discount> 
          <Total>291.64</Total> 
          <Adults>2</Adults> 
          <Children>1</Children> 
          <Infants>0</Infants> 
          <Errata /> 
         </RoomType> 
         <RoomType> 
          <Seq>1</Seq> 
          <PropertyRoomTypeID>690039002</PropertyRoomTypeID> 
          <MealBasisID>5</MealBasisID> 
          <RoomType>Double/twin Room</RoomType> 
          <RoomView /> 
          <MealBasis>Pension Complète</MealBasis> 
          <NonRefundableRates>false</NonRefundableRates> 
          <SubTotal>529.22</SubTotal> 
          <Discount>0</Discount> 
          <Total>529.22</Total> 
          <Adults>2</Adults> 
          <Children>1</Children> 
          <Infants>0</Infants> 
          <Errata /> 
         </RoomType> 
         </RoomTypes> 
        </PropertyResult> 
       </PropertyResults> 
      </SearchResult> 
      </SearchResponse> 
     </soap:Body> 
    </soap:Envelope> 

मेरे पास XML डेटा के साथ पर्याप्त अनुभव नहीं है। मैंने एक्सएमएल प्रतिक्रिया को PHP ऑब्जेक्ट या सरणी में बदलने की कोशिश करने में घंटों बिताए, लेकिन बिना किसी सफलता के।

मुझे सभी संपत्ति समीक्षा पढ़ने की आवश्यकता है।

पीएचपी कोड:

$xml = simplexml_load_string($soap_xml_result); 

$xml->registerXPathNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/'); 
$xml->registerXPathNamespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance'); 
$xml->registerXPathNamespace('xsd', 'http://www.w3.org/2001/XMLSchema'); 

$test = (string) $xml->Body->SearchResponse->SearchResult->SearchURL; 
var_export($test); 

उत्तर

9

bksi का संकेत गलत नहीं है, हालांकि तकनीकी रूप से यह XML है क्योंकि आपको केवल नामित तत्वों को ठीक से एक्सेस करने की आवश्यकता है।

$soap = simplexml_load_string($soapXMLResult); 
$soap->registerXPathNamespace('ns1', 'http://ivectorbookingxml/'); 
$test = (string) $soap->xpath('//ns1:SearchResponse/ns1:SearchResult/ns1:SearchURL[1]')[0]; 
var_dump($test); 

आउटपुट::

string(100) "http://www.lowcostholidays.fr/dl.aspx?p=0,8,5,0&date=10/05/2013&duration=15&room1=2,1,0_5&regionid=9" 

आप XPath का उपयोग नहीं करना चाहते, तो आप निर्दिष्ट करने की आवश्यकता यह एक XPath अभिव्यक्ति अपने स्वयं के उपसर्ग के namspace-uri का उपयोग करने और पंजीकरण से अधिक आसान काम करता है जब आप ट्रैवर्स करते हैं तो नेमस्पेस, तत्व के नामस्थान में केवल बच्चे ही उपलब्ध होते हैं यदि तत्व स्वयं प्रीफ़िक्स नहीं किया जाता है। क्योंकि उस तत्व पहले से जुड़ा हुआ नहीं है

$test = (string) $response->SearchResult->SearchURL; 

: के रूप में आप यह पता

$soap  = simplexml_load_string($soapXMLResult); 
$response = $soap->children('http://schemas.xmlsoap.org/soap/envelope/') 
        ->Body->children() 
         ->SearchResponse 
; 

तो फिर तुम $response चर का उपयोग कर सकते हैं: मूल तत्व के रूप में पहले से जुड़ा हुआ है जब आप पहली बार प्रतिक्रिया करने के लिए पार करने के लिए की जरूरत है । एक और जटिल परिणाम लौटाया गया है, यह शायद सबसे अच्छा है क्योंकि आप आसानी से सभी प्रतिक्रिया मानों तक पहुंच सकते हैं।

हो सकता है कि कोड/वर्णन वहाँ सहायक होते हैं, भी:

आपका प्रश्न के समान है।

+0

के माध्यम से भी आपके उत्तर के लिए धन्यवाद, xPath नेमस्पेस 500 त्रुटि देता है, शायद एक सर्वर गलत कॉन्फ़िगरेशन। दूसरा समाधान महान काम करता है। – Hamza

2

हम्म। ऐसा करने के लिए आपको SOAP क्लाइंट का उपयोग करना चाहिए, न केवल SOAP अनुरोध भेजें। PHP ने एसओएपी कार्यक्षमताओं को एकीकृत किया है http://php.net/manual/en/book.soap.php

कस्टम साबुन पुस्तकालय हैं जैसे NuSOAP http://sourceforge.net/projects/nusoap/

अधिकांश PHP ढांचे में एसओएपी पुस्तकालय भी हैं।

+0

मैं nuSOAP साथ की कोशिश की, लेकिन मुझे एक त्रुटि कह रही है कि SOAPAction भले ही मैं PHP में भेज याद आ रही है मिल हेडर, और कॉल विधि – Hamza

9

आप एक डोम दस्तावेज़ के माध्यम से एसओएपी प्रतिक्रिया पारित करने पर विचार कर सकते हैं, और फिर इसे एक सरल एक्सएमएल ऑब्जेक्ट में परिवर्तित कर सकते हैं।

<?php 
$doc = new DOMDocument(); 
libxml_use_internal_errors(true); 
$doc->loadHTML($soap_response); 
libxml_clear_errors(); 
$xml = $doc->saveXML($doc->documentElement); 
$xml = simplexml_load_string($xml); 
$response = $xml->body->envelope->body->searchresponse; 
//print_r($response); exit; 
echo $response->searchresult->returnstatus->success; 
echo '<br>'; 
echo $response->searchresult->searchurl; 
?> 

हालांकि, इससे आपकी प्रतिक्रिया में विशेष वर्णों के साथ समस्याएं हो सकती हैं, जैसे é और à। अन्यथा, यह काम करता है।

0

एक अन्य समाधान, एकमात्र समाधान है कि मेरे लिए काम किया:

$xml = $soap_xml_result; 
$xml = preg_replace("/(<\/?)(\w+):([^>]*>)/", '$1$2$3', $xml); 
$xml = simplexml_load_string($xml); 
$json = json_encode($xml); 
$responseArray = json_decode($json, true); // true to have an array, false for an object 
print_r($responseArray); 

का आनंद लें :)

संबंधित मुद्दे