поменять мыльные префиксы в php - PullRequest
10 голосов
/ 28 декабря 2011

Я переписываю мыльный веб-сервис с .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 и SOAP.Измените конверт однако я бы хотел не взломать его так, как он.Кроме того, я создаю сервис мыла, который будет использоваться существующим приложением для iphone, не используя PHP для использования сервиса мыла с помощью SoapClient.Приложение для iphone просто анализирует сырой xml, и я не могу сейчас изменить приложение для iphone.

Ответы [ 2 ]

5 голосов
/ 06 января 2012

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

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

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

Что вы хотите?

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

Решение

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

1 голос
/ 04 января 2012

Если вы не хотите использовать регулярные выражения, я сделал эту быструю реализацию класса, которая использует DomXPath и DomDocument для очистки XML и добавления атрибута пространства имен на уровне узла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...