XQuery/送货状态报告
外观
< XQuery
(从 XQuery/网页抓取和Mashup 重定向)一个常见的任务是需要将本地数据与另一个网站上的相关数据集成。尽管越来越多的网站提供 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)
- 在生产环境中,一个简单的提取和存储送货数据的脚本可以安排每小时运行一次,以减少对本应用程序中使用的网站的需求。
- 该脚本使用一个通用的函数将任何简单的表格 XML 转换为 HTML 表格。
- HTML 元素与 XML 之间的映射取决于此页面的稳定性。由于相关表格存在 ID,因此路径得到了简化。
- 生产系统必须能够检测 HTTP 错误并采取相应措施。这将需要对 HTTP 请求和响应进行更多控制。此功能由 eXist 后续版本中的 HTTP 模块提供。此处用于获取 XML 的简化方法需要被替换。