`
tianshibaijia
  • 浏览: 1126400 次
文章分类
社区版块
存档分类
最新评论

13.4.1 读取值

 
阅读更多
13.4.1 读取值



我们要做的第一件事,是从 XML 中读取我们感兴趣的数据。我们要写一个函数,取一个 XDocument 对象的列表(用于数据集的每个页面),并返回一个序列,每个元素包含指示器、 地区名,年,其中的值被测量。

清单 13.14 显示,以 readValues 函数的形式,以及辅助函数,从表示一条记录的 XML 节点读数据。每个函数有一个参数,名为 parse,这是一个函数,用来解析实际字符串值。我们很快就会看到此参数背后的原因。



Listing 13.14 Reading values from the XML data (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 []
else [ (year, country), parse(value) ]

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");
...]



你可以看到,我们正在接近所需要的东西:现在可以直接从序列读数据。剩余的唯一刺激是,值明显是数字,但我们却把它作为字符串看待。幸运的是,这是容易解决的问题。


分享到:
评论

相关推荐

    《零基础学ASP.NET 2.0》第13章 ADO.NET 2.0对象

    13.4.1 DataReader对象的常用属性和方法 225 13.4.2 使用DataReader对象读取数据 226 13.5 DataSet对象 227 13.5.1 创建DataSet对象 228 13.5.2 向DataSet中添加DataTable 228 13.5.3 将控件绑定到DataSet 229 ...

    MATLAB图形图像处理

    8.7.2 图像文件的读取 8.7.3 图像文件的存储 8.7.4 图像数据类型的转换 8.7.5 图像文件格式的转换 第九章 MATLAB 图像显示与色彩 9.1 图像显示 9.1.1 imshow 函数 9.1.2 显示索引图像 9.1.3 显示灰度图像 ...

    matlab6.5图形图像处理源程序

    8.7.2 图像文件的读取 8.7.3 图像文件的存储 8.7.4 图像数据类型的转换 8.7.5 图像文件格式的转换 第九章 MATLAB 图像显示与色彩 9.1 图像显示 9.1.1 imshow 函数 9.1.2 显示索引图像 9.1.3 显示灰度图像 ...

    matlab6.5图形图象处理源程序

    8.7.2 图像文件的读取 8.7.3 图像文件的存储 8.7.4 图像数据类型的转换 8.7.5 图像文件格式的转换 第九章 MATLAB 图像显示与色彩 9.1 图像显示 9.1.1 imshow 函数 9.1.2 显示索引图像 9.1.3 显示灰度图像 ...

    VC++ matlab图像处理

    8.7.2 图像文件的读取 8.7.3 图像文件的存储 8.7.4 图像数据类型的转换 8.7.5 图像文件格式的转换 第九章 MATLAB 图像显示与色彩 9.1 图像显示 9.1.1 imshow 函数 9.1.2 显示索引图像 9.1.3 显示灰度图像 ...

    图形图像处理源程序-matlab6.5图形图像处理源程序.rar

    8.7.2 图像文件的读取 8.7.3 图像文件的存储 8.7.4 图像数据类型的转换 8.7.5 图像文件格式的转换 第九章 MATLAB 图像显示与色彩 9.1 图像显示 9.1.1 imshow 函数 9.1.2 显示索引图像 9.1.3 显示...

    Python核心编程第二版(ok)

     7.5.1 不允许一个键对应多个值   7.5.2 键必须是可哈希的   7.6 集合类型   7.6.1 如何创建集合类型和给集合赋值   7.6.2 如何访问集合中的值   7.6.3 如何更新集合   7.6.4 如何删除集合中的...

    轻松学C#(图解版)

    3.1.2 值的表示——字面量 26 3.1.3 转义序列 27 3.2 定义字段 27 3.2.1 定义字段 28 3.2.2 静态字段和实例字段的访问 28 3.2.3 字段初始化 29 3.2.4 字段的动态赋值——Read()和ReadLine() 31 3.2.5 字段输出 31 ...

    Windows应用程序捆绑核心编程光盘代码

    2.4.2 通过内存映射读取OEP值 38 2.4.3 读取OEP值方法的测试 39 2.5 PE文件中的资源 40 2.5.1 查找资源在文件中的起始位置 40 2.5.2 确定PE文件中的资源 41 2.6 一个修改PE可执行文件的完整实例 43 2.6.1 如何...

    [Flash.ActionScript.3.0动画教程

    13.4.1 给它一些空间 13.4.2 加入重力 13.4.3 控制碰撞 13.4.4 控制反应 13.4.5 屏幕折回 13.5 小结 第14章 反向运动:拖动和伸展 14.1 单物体的拖拽与伸展 14.1.1 单关节伸展 14.1.2 单关节拖拽 14.2 多关节拖拽 ...

    C语言入门经典(第4版)--源代码及课后练习答案

    10.3.5 读取十六进制和八进制值 379 10.3.6 用scanf()读取字符 381 10.3.7 scanf()的陷阱 383 10.3.8 从键盘上输入字符串 383 10.3.9 键盘的非格式化输入 384 10.4 屏幕输出 389 10.4.1 使用printf()格式输出...

    JavaScript王者归来part.1 总数2

     13.4.1 Internet Explorer事件模型   13.4.1.1 关于IE事件注册   13.4.1.2 IE Event对象的属性   13.4.1.3 IE中的事件起泡   13.4.2 Netscape 4事件模型   13.4.2.1 Netscape 4中的事件捕捉及其范例  ...

    Spring.3.x企业应用开发实战(完整版).part2

    13.4.1 Timer和TimerTask 13.4.2 Spring对JDK Timer的支持 13.5 Spring对JDK 5.0 Executor的支持 13.5.1 了解JDK 5.0的Executor 13.5.2 Spring对Executor所提供的抽象 13.6 实际应用中的任务调度 13.6.1 如何产生...

    Spring3.x企业应用开发实战(完整版) part1

    13.4.1 Timer和TimerTask 13.4.2 Spring对JDK Timer的支持 13.5 Spring对JDK 5.0 Executor的支持 13.5.1 了解JDK 5.0的Executor 13.5.2 Spring对Executor所提供的抽象 13.6 实际应用中的任务调度 13.6.1 如何产生...

    精通JS脚本之ExtJS框架.part2.rar

    6.4.3 CSS值元素选择符 6.4.4 Ext.query与Ext.select 6.5 应用模板 6.5.1 Ext.Template 6.5.2 Ext.XTemplate 第7章 设计表单类布局 7.1 Form表单简介 7.1.1 Form表单的基本配置 7.1.2 ExtJS对Form表单的封装...

    精通JS脚本之ExtJS框架.part1.rar

    6.4.3 CSS值元素选择符 6.4.4 Ext.query与Ext.select 6.5 应用模板 6.5.1 Ext.Template 6.5.2 Ext.XTemplate 第7章 设计表单类布局 7.1 Form表单简介 7.1.1 Form表单的基本配置 7.1.2 ExtJS对Form表单的封装...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    4.8.1 从控制台读取数据 94 4.8.2 结账程序中的循环 96 4.9 小结:Java不是一个直肠子 98 4.10 习题 99 第5章 数组 100 教学视频:35分钟 5.1 什么是数组 100 5.1.1 假设:如果需要逐个定义变量 100 5.1.2 ...

Global site tag (gtag.js) - Google Analytics