2014-02-12 46 views
0

我必須使用美國郵政費率計算器Web工具API查詢該樣品/例如迴應:編寫正確XPath查詢修剪USPS率計算器API XML響應

<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的BEST SHOT:

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

當我的var_dump($率),我返回一個空數組。這幾個小時我一直在搞這個。我可以使用一些指導。如果您需要更多信息,請告訴我們,並提前感謝您的幫助。

回答

0

兩個問題在這裏:

  • XML和XPath是區分大小寫的。你需要使用匹配的大寫。
  • 您正在嘗試匹配值「一流的包裝國際服務」,但你要匹配值包含遠遠不止這些(它也包含「&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); 
+0

你所做的第一點是瀏覽器渲染的一個功能。 USPS API是用Pascal Case特別編寫的,我的代碼也是如此。該XML示例是從Chrome的開發工具「複製爲HTML」快捷方式複製的。至於你的第二點,我試着在閱讀你的解決方案之前使用starts-with()做一個謂詞。它似乎也沒有工作!我會用你提出的謂詞來嘗試。 – user3299931

+0

除了您提到的大寫問題實際上不成問題之外,您的代碼也可以工作。 – user3299931