XQuery/送货状态报告
外观
< 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)
- 在生产环境中,可以调度一个简单的脚本每小时提取并存储送货数据到数据库中,以减少对该应用程序中使用的网站的需求。
- 该脚本使用一个通用函数将任何简单的表格 XML 转换为 HTML 表格。
- HTML 元素与 XML 之间的映射取决于此页面的稳定性。相关表格中存在 id,简化了路径。
- 生产系统必须能够检测 HTTP 错误并相应地采取行动。这将需要更多地控制 HTTP 请求和响应。eXist 后续版本中的 HTTP 模块提供了此功能。这里采用的简单方法来获取 XML 将需要替换。