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 文档中,提取我们想要的所有信息了。如果对这些新函数的功能还不熟,也不必担心:只要我们开始用它来处理实际数据,一切都会变得更加清晰了。

时间: 2024-10-11 20:53:55

13.3.1 实现 XML 辅助函数的相关文章

C#学习笔记(13)——传统方法读取XML

说明(2017-7-12 16:32:47): 1. LINQ的方法虽然很简单,但是有点不好理解,sql的写法总感觉很诡异,而且LINQ的本质也是用的传统方法,所以还是采用老办法吧! 2. 注释里的代码是按照网上文章写得,但是有些地方觉得有点绕,自己尝试一下,稍微简化了一下. 3. 一般都会说,主要用到了三个类:XmlDocument, XmlElement, XmlAttribute,因为目前我只需要进行查询,所以只用到了一个XmlDocument加载xml文件用,其他的都是一些杂七杂八的属性

DOM的概念和简单应用:使用DOM解析XML数据

概念:DOM是Document Object Model的简称,即文档数据模型. Oracle公司提供了JAXP(Java API for XML Processing)来解析XML.JAXP会把XML文档转换成一个DOM树,JAXP的三个包都在JDK中. org.w3c.dom;W3C推荐的解析文档的接口 org.xml.sax;使用SAX解析XML文档的接口 javax.xml.parsers;解析器工厂工具 一.使用DOM解析XML文档的步骤 1.创建解析器工厂对象,即DocumentBu

插件化—配置xml的辅助测试

1.xml文件,xml文件在res/xml目录下 1 <?xml version="1.0" encoding="utf-8"?> 2 <infos> 3 <city id="1"> 4 <temp>20C/30C</temp> 5 <weather>多云转晴</weather> 6 <wind>7-8级</wind> 7 <name

JSON &amp; XML 简析

转载自:http://my.oschina.net/aofe/blog/269260 JSON: XML: JSON格式说明: HTML & XML 的对比 HTML: XML: HTML5新特性: NSXMLParser解析方法: SAX(Simple API for XML)特点: DOM(Document Object Model)特点: NSXMLParser解析过程: XML目前应用场景: JSON & XML JSON: JSON是基于JavaScript的一个子集: 作为一种

SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-009-带参数的ADVICE2 配置文件为XML

一. 1.配置文件为xml时则切面类不用写aop的anotation 1 package com.springinaction.springidol; 2 3 public class Magician implements MindReader { 4 private String thoughts; 5 6 public void interceptThoughts(String thoughts) { 7 System.out.println("Intercepting volunteer

利用jaxp对xml进行dom解析

1 <?xml version="1.0" encoding="UTF-8"?> 2 <书架> 3 <书> 4 <书名>何茂赟自传</书名> 5 <作者>何茂赟</作者> 6 <售价>100.00元</售价> 7 </书> 8 <书> 9 <书名>何茂赟自传2</书名> 10 <作者>何茂赟</

JavaEE XML DOM4J解析

DOM4J解析 @author ixenos DOM4J常用API SAXReader reader = new SAXReader(); //Document对象也看成根节点 Document doc = reader.read(File file); //迭代当前节点下的子节点/也可foreach Iterator itr = doc.nodeIterator(); While(itr.hasNext()){ Node node = itr.next(); } //得到根节点 Element

Java获取XML节点总结之读取XML文档节点

dom4j是Java的XML API,用来读写XML文件的.目前有很多场景中使用dom4j来读写xml的.要使用dom4j开发,需要下载导入dom4j相应的jar文件.官网下载:http://www.dom4j.org/dom4j-1.6.1/github下载:http://dom4j.github.io/下载解压之后如图所示: 我们只需要把dom4j-1.6.1.jar文件构建到我们开发项目中就可以了. 下面就以Eclipse创建java项目的构建方法为例说明:声明:本Java项目的开发环境J

javaweb学习总结十一(JAX对XML文档进行DOM解析)

一:将内存中写好的xml文件读取到硬盘上 二:DOM方式对xml文件进行增删改查 1:添加节点(默认是在最后的子节点后面添加) 1 @Test 2 // 向元素中添加节点<version>1.0</version> 3 public void test5() throws Exception { 4 Document doc = getDoc(); 5 Node node = doc.getElementsByTagName("book").item(0); 6