Проблемы при использование стандартной библиотеки SoapClient

sergeicykalo

Новичок
При разработке Soap клиента столкнулся с такой проблемой.
Библиотека пропускает поля вида:
["Field"]=>
array(2) {
["!name:field"]=>
string(16) "bla-bla"
["!name:field2"]=>
string(149) "bla-bla"
}

Она их выводит как:
["Field"]=>
string(0) ""

При том что nusoap обрабатывает их хорошо. Но при использовании nusoap передача объемов около 50мг отваливается. Да и стандартный SoapClient быстрее работает.

Стандартный SoapClient не возвращает атрибуты структуры. Как с этим бороться?
 

Bambino

Новичок
Когда-то сталкивался с подобным в SimpleXML: при выводе var_dump объекта SimpleXML "пропускались" атрибуты XML-тегов.
Лечилось такой конструкцией:

PHP:
$xmlTag->attributes()->attributeName
Возможно в твоем случае нужно сделать что-то подобное?
 

sergeicykalo

Новичок
Нет так не получается. Есть как вариант возможность получить xml в виде строки $client->__getLastResponse(), а потом его отпарсить как тебе хочется.
Но неужели нет других способов.
 

sergeicykalo

Новичок
Нет не пробовал. Расскажите каким образом их использовать.
Например приходит такая структура:
<teg attr="test"/>

Сейчас SoapClient разбирая структуру выводит:
["teg"] => string(0)""

Как используя SoapParam вытащить attr="test"?
 

magic

lancer
SoapParam/SoapVal могут использоваться для отправления сложных данных. Для разбора результата нужно что-то типа такого:
PHP:
class someTag {
    protected $_;     // tag value goes here
    protected $_attr; // tag attribute

    public function __construct($value, $attr)
    {
        $this->_ = $value;
        $this->_attr = $attr;
    }
}

$a = new someTag('value1', 'attr1');

// Soap Clint initialization
// $client = new SoapClient(....)

// This SOAP call sends <Tag something="attr1">Value1</Tag> and returns <Tag something="attr2">Value2</Tag>
$b = $client->getTag(new SoapParam($a, 'tag'));

// When the return data has attributes, SOAP maps the attribute name to object properties.
// The text inside the element gets mapped to "_"
//
// [b] = stdClass Object
// {
//    [_] = 'Value2'
//    [something] = 'attr2'
// }
В качестве параметра для soap call можно и массив отослать:
PHP:
$params = array(
    'tag1' => array(
        '_'    => 'myvalue', // tag vaue
        'attr' => 'myattr'   // tag 
    ), 
    'tag2' => 'mytagblabla'
);

$b = $client->someCall($params);
 
Сверху