0

我从使用 USPS Rate Calculator Web Tool API 的查询中获得了这个示例/示例响应:

<service id="15">
    <pounds>0</pounds>
    <ounces>15</ounces>
    <mailtype>Package</mailtype>
    <container>RECTANGULAR</container>
    <size>LARGE</size>
    <width>2</width>
    <length>13</length>
    <height>13</height>
    <girth>30</girth>
    <country>ARGENTINA</country>
    <postage>16.25</postage>
    <extraservices>
        <extraservice>
            <serviceid>6</serviceid>
            <servicename>Certificate of Mailing</servicename>
            <available>True</available>
            <price>1.30</price>
        </extraservice>
        <extraservice>
            <serviceid>0</serviceid>
            <servicename>Registered Mail</servicename>
            <available>True</available>
            <price>13.65</price>
        </extraservice>
    </extraservices>
    <valueofcontents>32.25</valueofcontents>
    <inscomment>SERVICE</inscomment>
    <svccommitments>Varies by destination</svccommitments>
    <svcdescription>First-Class Package International Service&amp;lt;sup&amp;gt;&amp;#8482;&amp;lt;/sup&amp;gt;**</svcdescription>
    <maxdimensions>Other than rolls: Max. length 24", max length, height and depth (thickness) combined 36"&lt;br&gt;Rolls: Max. length 36". Max length and twice the diameter combined 42"</maxdimensions>
    <maxweight>4</maxweight>
</service>
</package>
</intlratev2response>

这是整个响应的一部分。还有其他两个服务元素,但这是我希望返回的节点。(我将父闭包留在底部供您查看,仅供参考。)这些不同服务元素的 ID 似乎是静态的,但 API 中没有任何内容表明它们是可用的。简而言之,我不愿依赖他们。此节点的基本标识符是 SvcDescription = First-Class Package International Service。后面有一些 html 编码的 hooey,但这是我试图定位的元素,并将它的父元素存储在 SimpleXMLElement 中。

这是我在 xpath 上的最佳拍摄:

$rate = $result->xpath('//Service[SvcDescription="*First-Class Package International Service"]/Postage');

当我 var_dump($rate) 时,我返回一个空数组。我已经搞砸了几个小时。我可以使用一些指导。如果您需要更多信息,请告诉我,并提前感谢您的帮助。

4

1 回答 1

0

这里有两个问题:

  • XML 和 XPath 区分大小写。您需要使用匹配的大小写。
  • 您正在尝试匹配值“First-Class Package International Service”,但您尝试匹配的值不仅仅包含此值(它还包含“ &amp;lt;sup&amp;gt;&amp;#8482;&amp;lt;/sup&amp;gt;”)

请试试这个:

$path = '//service[starts-with(svcdescription, "First-Class Package International Service")]/postage';
$rate = $result->xpath(path);
于 2014-02-12T05:10:07.820 回答