跳转到内容

XQuery/多页抓取和投票行为

来自维基教科书,开放世界中的开放书籍

通常,所需数据分散在多个网页上。

以下是一个从多个页面获取数据以收集美国众议院成员投票行为的示例。

任何一届众议院的议题索引由诸如 [1] 的页面提供。在这里,可以看出,报告任何连续编号投票的页面是由诸如 [2] 的查询生成的。

结果以 XML 页面形式返回,该页面使用 XSLT 在浏览器中呈现。XQuery doc() 函数检索底层 XML。

以下查询汇总了特定成员在 6 次特定投票中的投票行为。

<results>
{for $i in 10 to 15
let $path := concat("http://clerk.house.gov/evs/2007/roll0",$i,".xml")
let $report := doc($path)
let $bill := $report//vote-metadata
let $specificvote := $report//recorded-vote[legislator/@name-id = "E000215"]
let $result := concat(data($specificvote//legislator)," voted ",data($specificvote/vote)," ",data($bill/vote-question)," of ",data($bill//legis-num))
return
  <result>{$result}</result>
}
</results>

执行

更一般地说,以下函数将返回包含提取数据的 XML 节点。通常,投票页面使用前导零对投票编号进行编码,最小长度为 3 位数字。

declare function local:voting($repid as xs:string, $year as xs:integer, $rollnumbers as xs:integer*) {
for $rollno in $rollnumbers
let $zeropaddedrollnum  := concat(string-pad("0",max((0,3 - string-length(xs:string($rollno))))),xs:string($rollno))
let $path := concat("http://clerk.house.gov/evs/",$year,"/roll",$zeropaddedrollnum,".xml")
let $report := doc($path)
let $bill := $report//vote-metadata
let $specificvote := $report//recorded-vote[legislator/@name-id = $repid]
return
  <result>
     <year>{$year}</year>
     {$bill/rollcall-num}
     {$bill/vote-question}
     {$bill/legis-num}
     {$specificvote/legislator}
     {$specificvote/vote}
 
  </result>
};

<report>
  {local:voting("E000215",2007,10 to 15)}
</report>

执行


注意:最好使用 asp 终结点,因为这不会涉及此处因前导零而产生的复杂情况,但这会产生格式错误的 XML(??)。

华夏公益教科书