【问题标题】:Parsing XML Response using SOAP::Lite使用 SOAP::Lite 解析 XML 响应
【发布时间】: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 的 &lt;key&gt;,例如betagamma

【问题讨论】:

  • “剩余的ID”是什么意思?
  • 我的意思是我需要提取订阅 ID CD22222222CD33333333&lt;key&gt; 值。如何前往&lt;key&gt;&lt;number&gt;
  • 我没有解决方案,但可以确认它似乎在解码时合并了两个节点组communicationcommon-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


【解决方案1】:

&lt;number&gt;元素获取所有日期的xpath表达式:

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

要仅从 &lt;subscription-list&gt; 内的 &lt;number&gt; 元素中获取数据,&lt;default-subscription/&gt; 使用:

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

【讨论】:

  • 您能否提供一个工作示例来打印键“alpha”、“beta”和“gamma”?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 2016-09-03
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多