跳到內容

XQuery/送貨狀態報告

來自華夏公益教科書

一個常見的任務是需要將本地資料與另一個網站上的相關資料整合。儘管越來越多的網站提供 RSS Feed,但通常需要抓取網頁以獲取相關資料。


送貨狀態報告

[編輯 | 編輯原始碼]

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

在這個模擬示例中,一家公司維護著他們自己的所有委託送貨的記錄,包括使用的快遞服務以及該服務的託運單號。作為 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-to-XML 轉換(在 Yahoo Weather Feed 中使用),然後從 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 的簡化方法需要被替換。
華夏公益教科書