13.3.1 实现 XML 辅助函数
来源:互联网 发布:云计算相关论文 编辑:程序博客网 时间:2024/06/05 05:55
13.3.1 实现 XML 辅助函数
LINQ to XML 主要是为 C# 和 VB 而设计的,在 F# 中使用可能有些麻烦。例如,F# 不支持隐式类型转换(因为这会使类型推断变得复杂),所以,每次描述元素名时,都必须使用 XName.Get,而不能只用字符串。作为变通,可以写简单的辅助函数或自定义运算符,来完成这功工作。
我们可以很容易实现几个 F# 函数,把 LINQ to XML 最常用的部分打包起来,以非常类似 F# 的方式处理数据。在清单 13.8 中可以看到,大多数函数都非常简单。程序是用 F# Interactive 创建的,因此,可以通过推导出的类型签名,帮助了解函数。有一点值得注意,每个函数把输入元素作为最后一个参数,这样,我们可以使用管道运算符,来组合这些函数。
Listing 13.8 读 XML 的辅助函数 (F# Interactive)
> #r "System.Xml.dll" #r "System.Xml.Linq.dll" open System.Xml.Linq;;> let wb = "http://www.worldbank.org";; val wb : string = http://www.worldbank.org> let xattr s (el:XElement) = [1] el.Attribute(XName.Get(s)).Value let xelem s (el:XContainer) = [2] el.Element(XName.Get(s, wb)) let xvalue (el:XElement) = [3] el.Value let xelems s (el:XContainer) = [4] el.Elements(XName.Get(s, wb));; val xattr : string -> XElement -> string val xelem : string -> XContainer -> XElement val xvalue : XElement -> string val xelems : string -> XContainer -> seq<XElement>> let xnested path (el:XContainer) = [5] let res = path |> Seq.fold (fun xn s –> let child = xelem s xn child :> XContainer) el <-- 把元素向上转换成容器 res :?> XElement <-- 把结果向下转换成元素;; val xnested : seq<string> -> XContainer –> XElement
大多数辅助函数都很简单。xattr 返回指定属性的值[1];xelem 返回指定名字的子元素[2];xvalue 读取元素内的文本[3];xelems 返回指定名字的所有子元素[4];xnested 更有意义[5],通过指定一序列元素的名字,以此为路径返回所有子节点。当访问元素时,我们指定的 XML 命名空间,在从世界银行返回的文档中使用。在本章的后面,我们使用这些辅助函数时,只需要提供元素的本地名称。
清单 13.8 首先引用了 LINQ to XML 所需的程序集,导入包含比如 XElement 这样的类的命名空间。第一组函数用于访问任何给定元素的子节点、属性或值。注意,xelem 函数的参数为 XContainer,因此,既可以于普通的元素,也可以用于表示整个文档的对象。这之所以可能,是因为把实例作为输入参数值,传递给函数或方法时,F# 能够隐式转换为它的基类或实现的接口。在其他地方,没有隐式转换,比如,从 lambda 函数返回结果,这会使 xnested 函数稍微有点复杂,就需要增加几个显式强制转换。
xnested 函数的参数为名称的序列,并沿着这个路径,去查找深层嵌套的元素。它用 Seq.fold 实现,并使用输入元素作为初始状态;路径中的每个名称都执行 Lambda 函数;查找具有指定名称的当前元素的子元素,把它作为新的子元素返回。我们想要输入类型成为 XContainer,这样,折叠操作就能使用这个类型来表示当前状态。因此,我们需要在 lambda 函数内部,把要返回的元素向上强制转换成 XContainer,最后,再把结果向下强制转换成 XElement。
有了这些辅助函数以后,就可以轻松地从下载的 XML 文档中,提取我们想要的所有信息了。如果对这些新函数的功能还不熟,也不必担心:只要我们开始用它来处理实际数据,一切都会变得更加清晰了。
- 13.3.1 实现 XML 辅助函数
- 13.3.1 实现 XML 辅助函数
- 13.3.1 实现 XML 辅助函数
- 14.3.3 实现辅助函数
- 辅助函数
- 实现不需要辅助函数实现回调非静态类成员函数
- 实现不需要辅助函数实现回调非静态类成员函数
- xml读取辅助类
- STL vector 辅助函数
- 迭代器辅助函数
- 常用辅助函数集合
- 表单辅助函数-form_open()
- 迭代器和辅助函数
- Codeigniter Helper辅助函数
- Android 常用辅助函数
- 迭代器辅助函数
- formValidator辅助函数
- Shader 内置辅助函数
- 深入解析String#intern
- 铸造
- 10340 - All in All
- JS框架选取-extjs收费问题
- 13 个免费的 PNG 图像的优化和压缩工具
- 13.3.1 实现 XML 辅助函数
- GitHub上README写法暨GFM语法解读
- Codeforces Round #291 (Div. 2) -- C. Watto and Mechanism
- 百度地图结合ol3绘制行政区轮廓图
- FragmentManager及FragmentTransaction浅析
- LeetCode Combination Sum
- 2015/2/15
- Oracle sql语句中不支持boolean类型(decode&case)
- POJ 1141 Brackets Sequence (区间dp 括号匹配 经典题)