Chinaunix首页 | 论坛 | 博客
  • 博客访问: 376328
  • 博文数量: 1051
  • 博客积分: 53280
  • 博客等级: 大将
  • 技术积分: 6670
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-09 13:21
文章分类

全部博文(1051)

文章存档

2011年(1)

2008年(1050)

我的朋友

分类:

2008-09-09 16:46:55

    Scala 是一种在 ? 虚拟机(? Virtual Machine,JVM)上运行的流行的新型编程语言。Scala 被编译成字节码,因此它可以利用 Java 编程语言。然而它的语法使其在某些场景下成为 Java 的一个强有力的候补。这些场景之一就是 XML 处理。Scala 容许您以多种方式导航和处理解析后的 XML。它还为 XML 构建提供了一流支持,因此无需创建 XML 字符串或以编程方式构建 DOM 树。在本文中,您将了解 Scala 在这些方面的实际效用以及 Scala 如何将 XML 处理转变为一种乐事。
     常用缩写词
    API:应用程序编程接口(application programming interface)
    DOM:文档对象模型(Document Object Model)
    HTTP:超文本传输(Hypertext Transfer Protocol)
    JSON:JavaScript 对象标志(JavaScript Object Notation)
    SAX:Simple API for XML
    StAX:Streaming API For XML
    XML:可扩展标记语言(Extensible Markup Language)

 

    本文使用了 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 为 。默认的情况下它以 JSON 格式显示数据并且显示最新的 30 个条目。要将其改为 XML 格式,添加查询字符串参数 format=xml。例如,要将条目数目改为 100,添加查询字符串参数 num=100 。现在您只需要访问这个 URL。这在 Java 代码中很容易实现,因此在 Scala 代码也很容易。看一下 清单 1 中访问 FriendFeed 公共提要的代码。

    清单 1. 访问 FriendFeed

    view plaincopy to clipboardprint?
    object FriendFeed {

      import java.net.{URLConnection, URL}

      import scala.xml._

      def friendFeed():Elem = {

        val url = new URL("")

        val conn = url.openConnection

        XML.load(conn.getInputStream)

      }

    }

    object FriendFeed {

      import java.net.{URLConnection, URL}

      import scala.xml._

      def friendFeed():Elem = {

        val url = new URL("")

        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 所示。

 

[1]      

【责编:landy】

--------------------next---------------------

阅读(160) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~