2011-09-22 111 views
1

我想轉換soap xml響應並將其存儲在數據庫中。這是我擁有的XML。PHP - 將XML轉換爲PHP中的數組 - 在php中解析soap xml並將其存儲在數據庫中

<ENV:Envelope xmlns:ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://example.com/soap/example"> 
    <ENV:Body> 
     <ns1:GetCentresResponse> 
     <ExampleCentre> 
      <ns1:Cent> 
       <ID>200</ID> 
       <Name>example2</Name> 
       <Code>ex2</Code> 
       <Email>[email protected]</Email> 
       <Address1>example2, example2 </Address1> 
       <Address2>example2, example2 </Address2> 
       <City>example2</City> 
       <PostCode>111111</PostCode> 
       <Telephone>1111111111</Telephone> 
       <Location>11.11,-11.11</Location> 
       <URL>/example2/exam2/ex2</URL> 
      </ns1:Cent> 
     </ExampleCentre> 
     </ns1:GetCentresResponse> 
    </ENV:Body> 
</ENV:Envelope> 

我從服務器得到這個肥皂響應。我想將其轉換爲數組並將其存儲在數據庫中。我該怎麼辦?我知道答案可能很直接,但嘿,是一個新手:D

真的很感激我得到的任何幫助。

謝謝您的期待。

問候

回答

2

最好的解決辦法是使用PHP的SoapClient類外做這將返回一個對象,這個對象轉換成一個數組,像這樣的電話:

<?php 
$client = new SoapClient("http://localhost/code/soap.wsdl"); 

// Soap call with HelloWorld() method 
$something = $client->HelloWorld(array('option1' => 'attribute1')); 

// Convert object to array 
$array = (array)$something; 

?> 

你然後可以存儲在數據庫中。

+0

您可能想要提一下,SOAP調用的返回值將包含一個對象,該對象的成員與該XML文件相匹配。 –

+0

感謝這個,不知道這個類:) –

+0

嗨Lhunar,謝謝你的迴應。它的工作:) – BasicGem

1

如果您不能使用SoapClient來檢索PHP對象中的SOAP響應,請使用SimpleXML來分析肥皂響應。

例如(其中$xmlstr包含SOAP響應):

$element = new SimpleXMLElement($xmlstr); 
$centerElement = $element->Body->GetCentresResponse->ExampleCentre->Cent; 

$center = array(
    $centerElement->ID, 
    $centerElement->Name, 
    $centerElement->Code, 
    $centerElement->Email, 
    $centerElement->Address1, 
    $centerElement->Address2, 
    $centerElement->City, 
    $centerElement->PostCode, 
    $centerElement->Telephone, 
    $centerElement->Location, 
    $centerElement->URL, 
); 

現在你可以在數據庫中存儲$center

+0

嗨,謝謝你的迴應喬恩。它確實有效。與給出的其他答案一起。非常感謝。 – BasicGem

0

解析SOAP響應使用下面的代碼陣列:

你只需要調用與SOAP-XML功能。之後,它將返回一個Plain XML,然後您必須使用JSON編碼解碼將其轉換爲數組。

$plainXML = mungXML($soapXML); 
$arrayResult = json_decode(json_encode(SimpleXML_Load_String($plainXML, 'SimpleXMLElement', LIBXML_NOCDATA)), true); 


// FUNCTION TO MUNG THE XML SO WE DO NOT HAVE TO DEAL WITH NAMESPACE 
function mungXML($xml) 
{ 
    $obj = SimpleXML_Load_String($xml); 
    if ($obj === FALSE) return $xml; 

    // GET NAMESPACES, IF ANY 
    $nss = $obj->getNamespaces(TRUE); 
    if (empty($nss)) return $xml; 

    // CHANGE ns: INTO ns_ 
    $nsm = array_keys($nss); 
    foreach ($nsm as $key) 
    { 
     // A REGULAR EXPRESSION TO MUNG THE XML 
     $rgx 
     = '#'    // REGEX DELIMITER 
     . '('    // GROUP PATTERN 1 
     . '\<'    // LOCATE A LEFT WICKET 
     . '/?'    // MAYBE FOLLOWED BY A SLASH 
     . preg_quote($key) // THE NAMESPACE 
     . ')'    // END GROUP PATTERN 
     . '('    // GROUP PATTERN 2 
     . ':{1}'   // A COLON (EXACTLY ONE) 
     . ')'    // END GROUP PATTERN 
     . '#'    // REGEX DELIMITER 
     ; 
     // INSERT THE UNDERSCORE INTO THE TAG NAME 
     $rep 
     = '$1'   // BACKREFERENCE TO GROUP 1 
     . '_'   // LITERAL UNDERSCORE IN PLACE OF GROUP 2 
     ; 
     // PERFORM THE REPLACEMENT 
     $xml = preg_replace($rgx, $rep, $xml); 
    } 
    return $xml; 
} 

print_r($arrayResult);