Intereting Posts
Откат гибридного файла php и js PHP GD-библиотека установлена, но не работает на CentOS 6.4 PHP jpgraph анализирует x и ось y через URL-адрес? PDO не может сравнивать mysql ENUM с использованием целых чисел в подготовленных операциях Как установить AND условие для ВСЕХ столбцов – php Проверить форму перед отправкой на php Как я могу изменить свой код для эхо-данных данных элемента child, где был найден мой поисковый запрос, в XMLReader? SQL-запрос работает некорректно (числа) Неустранимая ошибка: превышено максимальное время выполнения 300 секунд Удалите поле проверки, если товары корзины относятся к определенным категориям товаров как получить доступ к куки на субдомене Как автоматически определять часовой пояс пользователя? PHP cURL не загружается при изменении php.ini PHP Pass File Handle для пользователя, чтобы файлы загружались и сохранялись на их машине Как определить, не был ли найден контент в URL-адресе фида, используя SimpleXML и PHP

PHP SoapClient, создающий XML-ссылки для идентичных элементов, делает его неприемлемым для обслуживания

Я работаю над клиентом SOAP на PHP, и вызовы проходят до уровня обслуживания, за исключением вызовов, где есть элементы, которые идентичны друг другу. Похоже, что когда это происходит, вместо создания двух отдельных, но идентичных элементов, например:

<ns1:someelement> <ns1:name>name1</ns1:name> <ns1:value>value1</ns1:value> </ns1:someelement> <ns1:someelement> <ns1:name>name1</ns1:name> <ns1:value>value1</ns1:value> </ns1:someelement> 

он настаивает на создании только одной копии элемента и присвоении ему идентификатора и использовании href для любых последующих экземпляров этого элемента (показано ниже), который не поддерживается используемым мной веб-сервисом (я не знаю, почему это есть, но это не имеет большого значения, потому что я не могу его изменить)

 <ns1:someelement id="#ref1"> <ns1:name>name1</ns1:name> <ns1:value>value1</ns1:value> </ns1:someelement> <ns1:someelement href="#ref1" /> 

Поэтому мой вопрос заключается в том, как заставить XML выходить с дублирующимися элементами, включенными в комплект, а не с помощью hrefs / ids. Я проверил документы для PHP SoapClient для опции или чего-то подобного, но ничего не нашел. Любая помощь или совет будут очень признательны. Благодарю.

SoapClient делает ссылку только тогда, когда вы используете один и тот же объект на нескольких узлах XML. Сделайте для каждого места новый объект, если вы не хотите ссылки.

  • Не используйте ссылки
  • Попробуйте добавить параметры вручную с помощью SoapParam
  • Попробуйте добавить параметры вручную с помощью SoapVar

 $soapClient->__soapCall('Method', array( new SoapParam($someelement1, 'someelement'), // or new SoapVar('<ns1:someelement><ns1:name>name1</ns1:name><ns1:value>value1</ns1:value></ns1:someelement>', XSD_ANYXML) )); 

В вашем PHP-коде создайте свойство с уникальным индексом, чтобы получившийся XML выглядел так:

 <ns1:someelement> <ns1:name>name1</ns1:name> <ns1:value>value1</ns1:value> <ns1:index>0</ns1:value> </ns1:someelement> <ns1:someelement> <ns1:name>name1</ns1:name> <ns1:value>value1</ns1:value> <ns1:index>1</ns1:value> </ns1:someelement> 

Тогда PHP SoapClient не сделает ссылки href на одни и те же копии данных, и веб-сервис успешно проигнорировал эти уникальные поля в моем случае. Нет, я не передаю одни и те же поля someelement в качестве ссылки в PHP-коде. Они клонированы, однако PHP SoapClient достаточно умен, чтобы, к сожалению, зацикливать их множественные события как ссылки.

Здравствуйте, Вы можете попробовать следующее:

Вам необходимо расширить SoapClient и исправить сгенерированный запрос:

Вам нужно добавить теги, которые вызывают проблемы здесь.

 $tags = ['Tag1', 'Tag2', 'Tag3']; 

И затем используйте MySoapClient вместо SoapClient

 class MySoapClient extends SoapClient { public function __construct($a, $b){ parent::__construct($a, $b); } public function __doRequest($request, $location, $action, $version, $one_way = 0) { $tags = ['Tag1', 'Tag2', 'Tag3']; foreach($tags as $tag){ if (preg_match("~<ns1:{$tag} id=\"ref(.+)\">(.+)</ns1:{$tag}>~ismU", $request, $matches)) { $ref = $matches[1]; $request = str_replace([' id="ref'.$ref.'"'], '', $request); $tagValue = "<ns1:{$tag}>{$matches[2]}</ns1:{$tag}>"; $request = str_replace("<ns1:{$tag} href=\"#ref{$ref}\"/>", $tagValue, $request); } } return parent::__doRequest($request, $location, $action, $version); } 

}