编写正确的xpath查询以修剪USPS Rate Calculator API XML响应

时间:2014-02-12 04:37:15

标签: php xpath simplexml usps

我使用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)时,我返回一个空数组。几个小时以来我一直在搞乱这个问题。我可以使用一些指导。如果您需要更多信息,请告诉我,并提前感谢您的帮助。

1 个答案:

答案 0 :(得分: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);