使用 SOAP::Lite 解析 XML 响应

Parsing XML Response using SOAP::Lite

提问人:h q 提问时间:10/10/2019 更新时间:10/15/2019 访问量:225

问:

使用 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 的 ID,例如 和。<key>betagamma

xml perl xpath soap xml 解析

评论

0赞 Jack Fleeting 10/10/2019
“剩余的ID”是什么意思?
0赞 h q 10/10/2019
我的意思是我需要提取订阅 ID 和 .我如何到达 or ?<key>CD22222222CD33333333<key><number>
0赞 Nick P 10/10/2019
我没有解决方案,但可以确认它似乎正在合并两个节点组并解码时。我在节点 2 和 3 的输出中看到。如果我从节点中删除属性(或更改它们的值以与后面的节点不匹配),它会按您预期的方式工作。communicationcommon-dataactionsidrule
0赞 h q 10/10/2019
谢谢你@NickP - 是的,这就是我所观察到的。有时我想知道我是否应该在调用和解析 XML 时使用 ;但是,我认为SOAP错误和错误处理会变得太复杂了。outputxml(1)SOAP::LiteXML::Twig
0赞 Jack Fleeting 10/10/2019
@hq - 是否要排除与订阅 ID 相关的信息?如果是这样,排除的 ID 是否始终是第一个?总是以“PD”而不是“CD”开头?一般来说,在包含的 ID 中排除的共同点是什么?PD11111111

答:

1赞 Jack Fleeting 10/15/2019 #1

用于从元素中获取所有日期的 xpath 表达式:<number>

//services/common-data//subscription//number/text()

要仅从 which 中的元素中获取数据,请使用:<number><subscription-list><default-subscription/>

//services/common-data//subscription[.//child::*[name()='default-subscription']]//number/text()

评论

0赞 h q 2/24/2020
您能否提供一个工作示例来打印“alpha”、“beta”和“gamma”键?谢谢!