【发布时间】:2020-02-07 04:24:33
【问题描述】:
使用 SOAP::Lite 我正在尝试解析 XML 响应;但是,SOAP::SOM 并没有给我想要的值。它似乎与我试图找到的路径不同。
#!/usr/bin/env perl
use strict;
use warnings;
use SOAP::Lite;
use Data::Dumper;
my $xml = <<'__XML__';
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<GetResponse>
<services>
<communication>
<ruleset>
<rule id="CD22222222">
<id>CD22222222</id>
<conditions>
<xtra>
<one id="sip:+22222222@ims">
<id>sip:+22222222@ims</id>
</one>
<one id="tel:+22222222">
<id>tel:+22222222</id>
</one>
</xtra>
</conditions>
<actions>
<allow>false</allow>
</actions>
</rule>
<rule id="CD33333333">
<id>CD33333333</id>
<conditions>
<xtra>
<one id="sip:+33333333@ims">
<id>sip:+33333333@ims</id>
</one>
<one id="tel:+33333333">
<id>tel:+33333333</id>
</one>
</xtra>
</conditions>
<actions>
<allow>false</allow>
</actions>
</rule>
</ruleset>
</communication>
<common-data>
<subscription-list>
<subscription id="PD11111111">
<id>PD11111111</id>
<number>11111111</number>
<key>alpha</key>
<default-subscription/>
</subscription>
<subscription id="CD22222222">
<id>CD22222222</id>
<number>22222222</number>
<key>beta</key>
</subscription>
<subscription id="CD33333333">
<id>CD33333333</id>
<number>33333333</number>
<key>gama</key>
</subscription>
</subscription-list>
</common-data>
</services>
</GetResponse>
</S:Body>
</S:Envelope>
__XML__
my $som = SOAP::Deserializer->deserialize($xml);
print Dumper($som->valueof('//services/common-data/subscription-list/'));
我使用不同的 XML 路径获取相同 ID 的值。
我想从请求的 XML 路径中获取剩余 ID 的 <key>,例如beta 和 gamma。
【问题讨论】:
-
“剩余的ID”是什么意思?
-
我的意思是我需要提取订阅 ID
CD22222222和CD33333333的<key>值。如何前往<key>或<number>? -
我没有解决方案,但可以确认它似乎在解码时合并了两个节点组
communication和common-data。我在节点 2 和 3 的输出中看到actions。如果我从rule节点中删除id属性(或将它们的值更改为与后面的节点不匹配),它会按您预期的那样工作。 -
谢谢@NickP- 是的,这就是我观察到的。有时我想知道是否应该在调用
SOAP::Lite时使用outputxml(1)并使用XML::Twig解析XML;但是,我认为 SOAP 错误和错误处理会变得过于复杂。 -
@hq - 你想排除与订阅 ID
PD11111111相关的信息吗?如果是这样,排除的 ID 总是第一个吗?总是以“PD”而不是“CD”开头?一般来说,包含的 ID 中排除的共同点是什么?
标签: xml perl xpath soap xml-parsing