Я переписываю мыльный веб-сервис из .net в php. по умолчанию php дает мне теги, которые выглядят так:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/"><SOAP-ENV:Header><ns1:FindAllCategories/></SOAP-ENV:Header><SOAP-ENV:Body><ns1:FindAllCategoriesResponse><ns1:FindAllCategoriesResult><ns1:ArtistCategoryDto>
и т.д…
но мне это нужно:
<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><FindAllCategoriesResponse xmlns="http://tempuri.org/"><FindAllCategoriesResult><ArtistCategoryDto>
Это похоже на вопрос здесь: PHP AND SOAP. Измените конверт, но я бы не хотел его взломать так, как он. Кроме того, я создаю мыльную услугу, которая будет потребляться существующим приложением iphone, а не использование PHP для использования мыльного сервиса с использованием SoapClient. Приложение iphone просто анализирует необработанный xml, и я не могу изменить приложение iphone прямо сейчас.
После перечитания того, что вы хотите, и поиска в документации по php здесь, я решил и несколько допущений, которые я сделал
Предположения
Что ты хочешь?
Решение
<?php // Create you parse function - Regex function SoapServerRegexParser($input) { // $input contains your XML Response // Do str_replace or preg_replace $request = preg_replace({do replace}); //return modified output to client return $request; } // OR create you parse function - Regex XML Parser function SoapServerXMLParser($input) { // $input contains your XML Response // Use any xml parser that you would like $xml = new DOMDocument(); $xml->formatOutput = true; $xml->preserveWhiteSpace = false; $xml->loadXML($input); //Do replacement have a looke at: DOMNode::replaceChild //return modified output to client return $xml->saveXML(); } // Make php buffer all output // Send all output to a callBack function // Replace 'SoapServerRegexParser' with the callback function name of choice ob_start('SoapServerRegexParser'); //buffer output and set callback function // Create SoapServer $server = new SoapServer('wsdlfile.wsdl'); $server->handle(); //Handle incoming request ob_end_flush(); //Release buffer, but send through callback function first ?>
Это должно сделать трюк, я не создал часть регулярного выражения или фактическую замену узла xlm, но я полагаю, что вы можете сделать это сами
Если вы не хотите использовать регулярные выражения, я сделал эту быструю реализацию класса, которая использует DomXPath и DomDocument для очистки XML и добавления атрибута пространства имен на уровне узла.
<?php public BetterSoapClient extends SoapClient { public function __construct($wsdl, $options = null) { parent::__construct($wsdl, $options); } public function __doRequest($request, $location, $action, $version) { $dom = new DOMDocument('1.0'); // loads the SOAP request to the Document $dom->loadXML($request); // Create a XPath object $path = new DOMXPath($dom); // Search the nodes to fix $nodesToFix = $path->query('//SOAP-ENV:Envelope/SOAP-ENV:Body/*', null, true); // Remove unwanted namespaces $this->fixNamespace($nodesToFix, 'ns1', 'http://tempuri.org/'); // Save the modified SOAP request $request = $dom->saveXML(); return parent::__doRequest($request, $location, $action, $version); } public function fixNamespace(DOMNodeList $nodes, $namespace, $value) { // Remove namespace from envelope $nodes->item(0) ->ownerDocument ->firstChild ->removeAttributeNS($value, $namespace); //iterate through the node list and remove namespace foreach ($nodes as $node) { $nodeName = str_replace($namespace . ':', '', $node->nodeName); $newNode = $node->ownerDocument->createElement($nodeName); // Append namespace at the node level $newNode->setAttribute('xmlns', $value); // And replace former node $node->parentNode->replaceChild($newNode, $node); } } }