加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

文章标题

发布时间:2020-12-16 05:39:15 所属栏目:百科 来源:网络整理
导读:13.3.1 实现 XML 辅助函数 LINQ to XML 主要是为 C# 和 VB 而设计的,在 F# 中使用可能有些麻烦。例如,F# 不支持隐式类型转换(因为这会使类型推断变得复杂),所以,每次描述元素名时,都必须使用 XName.Get,而不能只用字符串。为了简化工作,需要写辅助

13.3.1 实现 XML 辅助函数

LINQ to XML 主要是为 C# 和 VB 而设计的,在 F# 中使用可能有些麻烦。例如,F# 不支持隐式类型转换(因为这会使类型推断变得复杂),所以,每次描述元素名时,都必须使用 XName.Get,而不能只用字符串。为了简化工作,需要写辅助函数或自定义运算符1。
用几个 F# 函数,把 LINQ to XML 最常用的部分包装起来,实现非常类似 F# 的方式处理数据,也很容易。在清单 13.8 中可以看到,大多数函数都非常简单。程序是用交互式 F# 创建的,因此,很容易从推导出的类型签名了解函数。有一点值得注意,每个函数的最后参数都是输入元素值,这样,就可以用管道运算符,来组合这些函数。

Listing 13.8 读 XML 的辅助函数(交互式 F#)
``
> #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

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 -> XContainer –> XElement “` 大多数辅助函数都很简单。xattr 返回指定属性的值[1];xelem 返回指定容器的子元素[2];xvalue 读取元素内的文本[3];xelems 返回指定容器的所有子元素[4];xnested 更有意义[5],由元素名的序列构成路径,返回所有子节点。当我们访问从世界银行返回的文档元素时,需要指定的 XML 命名空间;但是,在本章的后面,由于有了这些辅助函数,只需要提供元素的本地名就可以了。 为了使用 LINQ to XML,清单 13.8 首先引用了所需的程序集,导入包含类的命名空间,比如 XElement。第一组函数访问给定元素的子节点、属性或值。注意,xelem 函数的参数为 XContainer,因此,既可以于普通的元素,也可以用于表示整个文档的对象。之所以能这样,是因为把实例作为输入参数值,传递给函数或方法时,F# 能够隐式转换为它的基类或实现的接口。在其他地方,没有隐式转换,比如,从 lambda 函数返回结果,因此,xnested 函数稍微有点复杂,需要增加显式强制转换。 函数 xnested 用名字序列作为参数,根据这个路径,去查找嵌套的元素。用 Seq.fold 实现,并用输入的元素作为初始状态;路径中的每个名字都调用 Lambda 函数;找出指定名字为当前元素的所有子元素,以此作为新的子元素返回。输入类型应该是 XContainer,这样,折叠(fold)操作就能用这个类型来表示当前状态。因此,我们需要在 lambda 函数内部,把返回的元素向上强制转换成 XContainer,最后,再把结果向下强制转换成 XElement。 有了这些辅助函数以后,就可以轻松地从下载的 XML 文档中,提取我们想要的信息了。如果对这些新函数的功能还不熟,也不必担心:只要我们开始用它来处理实际数据,一切都会变得更加清晰了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读