您所在的位置:开发 > Java > Java+ > 使用Scala简化XML对象处理(1)

使用Scala简化XML对象处理(1)

2009-06-22 14:26 Michael Galpin IBMDW 字号:T | T
一键收藏,随时查看,分享好友!

Scala的语法使其在某些场景下成为 Java 的一个强有力的候补。这些场景之一就是 XML 处理。Scala 容许您以多种方式导航和处理解析后的 XML对象。它还为 XML 构建提供了一流支持,因此无需创建 XML 字符串或以编程方式构建 DOM 树。

AD:

本文使用了 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

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

注意,这里要做的第一件事就是导入两个核心的 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 方法 

  1. val feedXml = friendFeed 

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

内容导航



分享到:

热点职位

更多>>

热点专题

更多>>

读书

游戏开发核心技术--剧本和角色创造
《游戏开发核心技术--剧本和角色创造》分“剧本”、“角色”和“游戏玩法”三部分,第一部分着重说明故事的历史、一般故事元素、

51CTO旗下网站

领先的IT技术网站 51CTO 领先的中文存储媒体 WatchStor 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i