首页 > 解决方案 > 使用 SOAP::Lite 解析 XML 响应

问题描述

使用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 的值。

我想<key>从请求的 XML 路径中获取剩余 ID,例如betagamma

标签: xmlperlxpathsoapxml-parsing

解决方案


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

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

要仅从<number>a 内部的元素中获取数据,<subscription-list>这是一个<default-subscription/>用途:

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

推荐阅读