码迷,mamicode.com
首页 > 其他好文 > 详细

13.4.1 读取值

时间:2015-02-17 17:39:45      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:xml   管道   

13.4.1 读取值

我们要做的第一件事,是从 XML 中读取感兴趣的数据。我们要写一个函数,它的参数是 XDocument 对象的列表(用于数据集的每个页面),返回的序列中,每个元素包含了指标、 地区名,年份,当年的测量值。
清单 13.14 展示了 readValues 函数的形式,以及从 XML 节点中读数据的工具函数,表示一条记录。两个函数有一个名为 parse 的参数,这是一个函数,用来解析实际的字符串值,我们很快就会看到使用这个参数背后的原因。

清单13.14 从XML 数据中读数据 (F#)

let readSingleValue parse node = 
  let value = node |> xelem "value" |> xvalue 
  let country = node |> xelem "country" |> xvlue 
  let year = node |> xelem "date" |> xvalue |> int 
  if (value = "") then []               | [1] 返回的列表,可能
  else [ (year, country), parse(value) ]   | 有 01 个元素

let readValues parse data = seq { 
  for page in data do 
    let root = page |> xnested [ "data" ] 
    for node in root |> xelems "data" do   <-- 找到所有页面中的所有数据点元素
      yield! node |> readSingleValue parse }

我们首先写的工具函数,它的参数为格式化函数,和 XML 节点,包含一个数据元素。它从子节点和属性中读值,将年转换为整数。如果我们看看下载的数据,就会发现 value 元素有时是空的。我们可以这样处理,如果这个值为空,返回空列表;否则,返回包含一个元素的列表。注意,我们还可以使用 option 类型,而列表使第二个函数更优雅:不必要区分两种情况;只要使用 yield! 基本操作,地返回所有元素(既可以是空,也可以是一个),就行了。
第二个函数取的参数为 XDocument 对象的序列,值为整个输入的数据,它找到包含数据输入的所有 XML 元素,进行格式化,再返回序列。返回序列的元素类型是 (int * string) * ‘a。前面的元组包含年份和国家名,我们将把它作为键,以后用于搜索数据,这就是我们使用嵌套元组的原因;后面的元素是使用 parse 函数格式化的值,因此,其类型始终与函数返回类型相同。
和往常一样,我们可以立即测试这个函数。函数的关键输入是数据源,作为最后一个参数,因此,我们可以使用管道操作符。(用于测试目的)最简单解析的器,是给它什么字符串,就返回什么字符串,而不要处理它。下面的代码片断演示如何处理第一个数据集,其中包含 1990 年所有国家的总面积。我们使用恒等函数(identity function)id,解析输入,因此,值将被格式化成字符串:

> data.[0] |> readValues id;; 
val it : seq<(int * string) * string> = 
seq [ ((1990, "ABW"), "180"); ((1990, "ADO"), "470"); 
((1990, "AFG"), "652090"); ((1990, "AGO"), "1246700"); 
...]

可以发现,我们正在接近所需要的东西:现在可以直接从序列中读出数据了,剩下唯一的不足就是,值明显是数字,而我们却把它作为字符串看待。不过,这很容易解决。

13.4.1 读取值

标签:xml   管道   

原文地址:http://blog.csdn.net/hadstj/article/details/43866939

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!