Я работаю над клиентом 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); }
}