13.4.1 读取值
13.4.1 读取值 我们要做的第一件事,是从 XML 中读取感兴趣的数据。我们要写一个函数,它的参数是 XDocument 对象的列表(用于数据集的每个页面),返回的序列中,每个元素包含了指标、 地区名,年份,当年的测量值。 清单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) ] | 有 0 或 1 个元素
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! 基本操作,地返回所有元素(既可以是空,也可以是一个),就行了。 > data.[0] |> readValues id;;
val it : seq<(int * string) * string> =
seq [ ((1990,"ABW"),"180"); ((1990,"ADO"),"470");
((1990,"AFG"),"652090"); ((1990,"AGO"),"1246700");
...]
可以发现,我们正在接近所需要的东西:现在可以直接从序列中读出数据了,剩下唯一的不足就是,值明显是数字,而我们却把它作为字符串看待。不过,这很容易解决。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |