跳轉到內容

XQuery/送貨狀態報告

來自華夏公益教科書,開放的書籍,開放的世界

一個常見的任務是需要將本地資料與另一個站點上的相關資料整合。雖然越來越多的站點提供 RSS 訂閱源,但通常需要抓取網頁才能獲取相關資料。


送貨狀態報告

[編輯 | 編輯原始碼]

一個這樣的例子是,一家公司需要監控使用快遞服務的送貨狀態。

在這個模擬示例中,一家公司維護他們自己所有委託送貨的記錄,包括使用的送貨服務以及該服務的託運單號。作為一個 XML 檔案,這可能看起來像這樣;

<DeliveryList>
  <Delivery><CustomerName>Fred Flintstone</CustomerName><Service>CityLink</Service> <ConsignmentNo>RZL14823</ConsignmentNo></Delivery>   
  <Delivery><CustomerName>Bill Bailey</CustomerName><Service>CityLink</Service> <ConsignmentNo>RZL14869</ConsignmentNo></Delivery>   
  <Delivery><CustomerName>Jack and Jill</CustomerName><Service>CityExpress</Service> <ConsignmentNo>RXL9999</ConsignmentNo></Delivery>   
 </DeliveryList>

整合報告

[編輯 | 編輯原始碼]

以下指令碼展示瞭如何將本地送貨資料與從送貨公司獲取的此送貨資料相結合。在本例中,送貨公司 City-Line 為每個託運單提供一個頁面,以報告其狀態。

該指令碼遍歷相關的送貨記錄,並構建相應的 URL 來讀取每個送貨記錄的頁面。該頁面被輸入到一個 HTML 到 XML 的轉換器(在 Yahoo 天氣訂閱源中使用),然後從 HTML 中檢索特定的元素以構建頁面的 XML 提取。然後將此 XML 資料與本地資料相結合,以建立組合報告。

import module namespace  fwiki = "http://www.cems.uwe.ac.uk/xmlwiki" at "../reports/util.xqm";
declare option exist:serialize "method=xhtml media-type=text/html";

declare variable $citylinkURL := "http://www.city-link.co.uk/pod/podfrm.php?JobNo=ZZZZ";

declare function  local:get-consignment($consNo) {
let $citylinkURL := replace($citylinkURL,"ZZZZ",$consNo)
let $page := fwiki:html-to-xml($citylinkURL)
return  
 <Consignment>
     <CustomerReference> 
        {string($page//table[@id="this_table_holds_the_summary_info"]/tr[1]/td[2])} 
    </CustomerReference>
    <ScheduledDeliveryDate>
        {string($page//table[@id="this_table_holds_the_summary_info"]/tr[1]/td[4])}
    </ScheduledDeliveryDate>
    <DeliveryStatus>
        {string($page//table[@id="this_table_holds_the_detailed_status_desc"]/tr[1]/td[2])}
    </DeliveryStatus>
 </Consignment>
};

let $report := 
<Report>
{for $delivery in //Delivery[Service="CityLink"]
 let $citylink := local:get-consignment($delivery/ConsignmentNo)
 return  
   <Delivery>
        {$delivery/*}
        {$citylink/*}
    </Delivery>
}
</Report>
return
  fwiki:element-seq-to-table($report)

顯示報告

  1. 在生產環境中,可以排程一個簡單的指令碼每小時提取並存儲送貨資料到資料庫中,以減少對該應用程式中使用的網站的需求。
  2. 該指令碼使用一個通用函式將任何簡單的表格 XML 轉換為 HTML 表格。
  3. HTML 元素與 XML 之間的對映取決於此頁面的穩定性。相關表格中存在 id,簡化了路徑。
  4. 生產系統必須能夠檢測 HTTP 錯誤並相應地採取行動。這將需要更多地控制 HTTP 請求和響應。eXist 後續版本中的 HTTP 模組提供了此功能。這裡採用的簡單方法來獲取 XML 將需要替換。
華夏公益教科書