изменить префиксы мыла в php

Я переписываю мыльный веб-сервис из .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 прямо сейчас.

Solutions Collecting From Web of "изменить префиксы мыла в php"

После перечитания того, что вы хотите, и поиска в документации по php здесь, я решил и несколько допущений, которые я сделал

Предположения

  • Если я прав, вы знаете, что сам префикс SOAP не является проблемой (вам разрешено использовать любой префикс, если он согласован).
  • Нам нужно создать обход для этого конкретного приложения Iphone, в котором используется синтаксический анализатор (xml), который в настоящее время не может быть изменен или обновлен вами

Что ты хочешь?

  1. Вы хотите использовать собственный API для изменения префикса SOAP
  2. Вы хотите поймать ответ SoapServer, чтобы вы могли изменить префикс SOAP до его возвращения

Решение

  1. В настоящее время нет собственного метода API SoapServer для изменения префикса SOAP
  2. Вы можете поймать ответ SoapServer и обработать ответ либо с помощью регулярного выражения, либо с помощью анализатора xml, см. Пример ниже
 <?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); } } }