Я хочу преобразовать XML-запрос мыла и сохранить его в базе данных. Вот 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>example2@example2.com</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
Был бы очень признателен за любую помощь, которую я получу.
Благодарю вас в ожидании.
С уважением
Лучшим решением было бы использовать класс SoapClient PHP для выполнения вызова, который вернет вам объект, а затем преобразует этот объект в массив, например:
<?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; ?>
Что вы можете сохранить в базе данных.
Если вы не можете использовать SoapClient
для получения ответа SOAP в объекте PHP, используйте 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, );
-$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
в базе данных.
Разберите 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);