以下是我认为相关的SOAP :: Lite代码
my $req3 = SOAP::Lite->new(
readable => 1,
autotype => 0,
proxy => 'https://ics2wstest.ic3.com/commerce/1.x/transactionProcessor',
);
$req3->requestMessage(
\SOAP::Data->new(
name => 'item',
attr => { foo => '0' },
value => \SOAP::Data->new(
name => 'foo',
value => 1,
),
),
);
它正在生成此XML
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<requestMessage>
<c-gensym9>
<item foo="0">
<foo>1</foo>
</item>
</c-gensym9>
</requestMessage>
</soap:Body>
我无法弄清楚为什么<c-gensym9 />
嵌套在<requestMessage>
内,但我不需要在那里。任何人都可以解释为什么它在那里?以及如何重写代码以便它不是?
答案 0 :(得分:3)
看马,没有gensym
$req3->requestMessage(
## \SOAP::Data->new( ## this makes gensym
SOAP::Data->new( ## no refref, no gensym
name => 'item',
attr => { foo => '0' },
value => \SOAP::Data->new(
name => 'foo',
value => 1,
),
),
);
答案 1 :(得分:0)
不幸的是,我们真正需要帮助回答的代码是您(非常无意中)被排除在... # noisy SOAP::Data stuff
之外的代码。
SOAP :: Lite可以很高兴。只要它不理解它试图生成的完整数据结构,它就会使用此标记。因此,在您的示例中,定义requestMessage
标记的SOAP :: Data对象似乎在不期望一个数组时传递数组,因此需要一个未命名的(c-gensym5)中间标记。
考虑到上面生成的内容,您似乎尝试传入一个带有哈希[ { data } ]
的数组?每当SOAP :: Lite感觉到名称应该存在时(即[ no name for hash --> { data } ]
),当没有提供时,它将“gensym”来澄清输出。也可能是SOAP :: Lite期望转义的东西没有被转义。
在soaplite.com上发布了一篇名为How do you turnoff the blasted c-gensym elements?的非常官方的帖子,遗憾的是它本身并不是很有用(因为链接已经死了)但是后机可以提供帮助。
我希望这会有所帮助。对不起,我不能更具体!