鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 网站制作教程 > XML/RSS > >

如何利用Scala简化XML处理(1)

来源:互联网 作者:佚名 时间:2015-03-02 14:46
本文使用了 Scala 编程语言,其版本为 2.6.1。作为一种新生语言,它仍在快速发展,因此需要了解它的最新进展。本文并不要求读者具备 Scala 知识,而是尝试介绍 Scala 的语法和术语。Scala 需要一个 Java 虚拟机。本文使用 JDK 1.6.0_04,但 Scala 只需要 1.5

本文使用了 Scala 编程语言,其版本为 2.6.1。作为一种新生语言,它仍在快速发展,因此需要了解它的最新进展。本文并不要求读者具备 Scala 知识,而是尝试介绍 Scala 的语法和术语。Scala 需要一个 Java 虚拟机。本文使用 JDK 1.6.0_04,但 Scala 只需要 1.5 或更高版本。尽管本文没有包含 Java 代码,但是也要求读者熟悉 Java 编程。

解析XML

首先探讨如何使用 Scala 解析 XML。像大多数编程语言一样,Scala 提供了多种 XML 解析方法。以下是一些基本的方法:基于表示的 InfoSet/DOM、push (SAX) 或 pull (StAX) 事件、与 JAXB(Java Architecture for XML Binding) 类似的数据绑定。您将探讨基于 DOM 的处理,因为它演示了 Scala 语法的众多好处。在深入研究之前,您需要了解要解析的 XML 内容以及对它执行哪些操作。因此需要借助一个样例应用程序。

样例应用程序:FriendFeed

FriendFeed 是一个在 2008 年非常流行的 Web 服务,它允许用户在其他服务中聚合他们的行为,例如各种博客(blog)服务、即时信息传递服务、YouTube、Flickr 和 Twitter 等。然后从这种聚合中创建单独的数据提要。您可以针对个人执行上述操作,即对指定的人员实现聚合行为。尽管可能不是很有用,但是 FriendFeed 的公共提要非常有趣。它在所有 FriendFeed 用户之间聚合所有的公共行为。FriendFeed 提供一个 API 来访问个人提要和公共提要。您将编写一个应用程序来访问和解析公共提要。

利用 Java 库

您要做的首要事情是访问 FriendFeed 的公共提要。其 URL 为 http://friendfeed.com/api/feed/public。默认的情况下它以 JSON 格式显示数据并且显示最新的 30 个条目。要将其改为 XML 格式,添加查询字符串参数 format=xml。例如,要将条目数目改为 100,添加查询字符串参数 num=100 。现在您只需要访问这个 URL。这在 Java 代码中很容易实现,因此在 Scala 代码也很容易。看一下清单1中访问 FriendFeed 公共提要的代码。

清单 1. 访问 FriendFeed

object FriendFeed {
 import java.net.{URLConnection, URL}
 import scala.xml._
 def friendFeed():Elem = {
val url = new URL("http://friendfeed.com/api/feed/public?format=xml&num=100")
val conn = url.openConnection
XML.load(conn.getInputStream)
 }
}

注意,这里要做的第一件事就是导入两个核心的 Java 类。 Scala 不必使用自己的 API 执行诸如打开 HTTP 连接之类的操作,因为它可以利用 Java 的 API 来解决这个问题。注意 Scala 为从同一包导入多个类提供了捷径。下一行导入 Scala 的核心XML 类。下划线就像Java 中的星号一样,它导入scala.xml 包中的所有类。

因此使用 Java 的 API 打开一个到 FriendFeed 的 HTTP 连接。接下来使用 Scala 的 XML 对象进行解析。这里有很多有趣的现象。首先,XML 是一个 Scala 对象,即它是一个单例(singleton)对象。Scala 没有静态的方法、字段和初始化程序。相反您可以定义一个对象(而不是类)并且它将成为类的一个单例实例。您可以像调用静态方法一样访问单例对象的方法。这就是 XML.load 语句的作用。注意,尽管这是一个 Scala 对象的方法,它接受一个 Java 对象(java.io.InputStream)作为参数。这正体现了 Scala 和 Java 之间的紧密联系。最后要注意没有返回语句。返回语句在 Scala 中是可选的。如果没有返回语句,将返回对方法的最后一个语句的求值(如果可行并且 Scala 没有返回编译错误的话)。现在可以很简单地访问 清单 1 中的方法,如清单2所示。

清单 2. 访问 friendFeed 方法

val feedXml = friendFeed

注意在调用 friendFeed 的方法时没有必要使用圆括号。您也可以使用 Scala 的类型接口。您没有必要声明 feedXml 的类型,因为它是由 friendFeed 方法的返回类型推断出来的。再次查看 清单 1 并了解它如何利用语法捷径。最后要注意的是您所解析的 XML 对象被声明为 val。这使其成为不可变的对象(像 Java 代码中的字符串),这在 Scala 中是很常见的。把 XML 作为一个不可变的对象有很多优点,但是如果您习惯在 DOM 中使用 appendChild API,那么则很难适应这一点。现在已经从 FriendFeed 中解析了XML,可以开始使用Scala 对其划分。

网友评论
<