13.3.2 提取区域的代码

728 篇文章 1 订阅
38 篇文章 0 订阅
13.3.2 提取区域的代码



    我们下载函数的结果是一个字符串,所以,需要将字符串作解析为 XML 文档。我们将频繁需要这个操作,所以,要写一个简单的打包函数,使用 worldBankDownload 下载数据,返回结果为 XDocument 对象。下载执行异步,因此,要使用异步工作流实现这个函数:



let worldBankRequest(props) = async {
  let! text = worldBankDownload(props)
  return XDocument.Parse(text) }



    代码首先使用 let! 调用异步下载。完成后,解析 XML 数据,并返回 XDocument 对象。一旦使用 Async.RunSynchronously,执行下载,可以使用上一节中的辅助函数,来查询返回的 XML 文档。清单 13.9 显示了一个这样的示例,它下载了有关国家的汇总信息,然后访问我们稍后需要一些值。



Listing 13.9 Exploring the region information (F# Interactive)



> let doc =
    worldBankRequest(["countries"], ["region", "NA"])
    |> Async.RunSynchronously;;
val doc : XDocument = (...)

> let c = doc |> xnested ["countries"; "country" ];;
val c : XElement

> c |> xattr "id";;
val it : string = "EAP"

> c |> xelem "name" |> xvalue;;
val it : string = "East Asia & Pacific"




    我们首先访问返回文档中的第一个 country 元素,这是名为 countries 的根元素的子元素。为了遍历 XML 树,我们使用 xnested 函数,指定要选择元素的路径。

    现在,我们可以看一下元素的内容,看到提取的信息。首先,我们演示了如何获取该区域的 ID。它存储在 id 属性中,使我们能够使用 xattr 函数读取它 。我们还需要区域的名字,能够以用户友好的格式显示数据。它是 name 元素的值。

    现在,我们已经探索了结构,确保我们知道如何访问所有的区域信息,对于一个区域来说需要的,我们可以遍历所有区域。清单 13.10 使用相同的函数,只是用了一个序列计算。



Listing 13.10 Creating sequence with region information (F# Interactive)



> let regions =
    seq { let countries = doc |> xnested [ "rsp"; "countries" ]
            for country in countries |> xelems "country" do
              yield country |> xelem "name" |> xvalue };;
val regions : seq<string * string> = seq
[ ("East Asia & Pacific";
("Europe & Central Asia";
("European Monetary Union";
("Heavily indebted poor countries (HIPC)"; ...]



    与前面的列表相比,唯一重要的变化是,我们现在可以处理所有数据中的 country  节点。我们使用 xelems 函数,来访问这些元素,比如序列,用 for 循环进行迭代。因为我们将使用序列表达式,所以,可以使用 yield 关键字生成结果元素。,我们使用在清单 13.9 中尝试过的代码部件,获取国家的用户友好名字,把它返回作为序列的元素。

    在本节中,我们已经看到,如何得到需要进一步研究的区域列表。重要的方面不是我们用过的确切代码,而是一般过程。我们创建了便于数据访问的辅助函数,检查我们了解文档的结构,通过交互方式读取信息,把代码打包到一个函数中。下一步,我们将下载想要显示的指标,比如,森林覆盖的区域。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值