您所在的位置:开发 > XML > 如何利用Scala简化XML处理(3)

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

2009-02-05 17:28 Michael Galpin IBM 我要评论(0) 字号:T | T
一键收藏,随时查看,分享好友!

Scala容许您以多种方式导航和处理解析后的XML。它还为XML构建提供了一流支持,因此无需创建XML字符串或以编程方式构建DOM树。在本文中,您将了解Scala在这些方面的实际效用以及Scala如何将XML处理转变为一种乐事。

AD:

创建XML

当创建新的 XML 文档时,Scala 的原生 XML 语法再合适不过。第一个例子是获取创建的 UserList 结构并把它封装在相关服务的节点中。清单6显示了这些代码。

清单 6. 创建服务结果

def results(name:String, cnt:Int, elements:NodeSeq):Any = {
  if (cnt > 0){
return <Service id={name}>{elements}</Service>
  }
}

由于 Scale 提供了对 XML 的原生支持,您可以利用一个模板样式的语法将动态数据插入到 XML 结构中。在本例中,使用传入的名称字符串设置 id 属性。您将获得一串传入的元素,将它们作为正在创建的 Service 元素的子节点。但是要注意,只有在 cnt 参数大于 0 的情况下才执行上述操作。如果 cnt 值等于 0,这个函数将不返回任何值。在 Scale 中您可以通过声明函数返回 Any 来解决这个问题。Any 类在 Scala 中是一个原始的类,类似于 java.lang.Object。Scale 没有 void 类型,但是有一个等价的 Unit 类型。它的优点是可以扩展 Any 类,并且允许函数在某些情况下返回对象,而在其他时候不返回任何内容。

如您所见,在 Scala 的 XML 语法中结合动态数据可以产生强大的功能。再举一个例子,您可以创建一个统计 XML 文档,其中显示的 XML 描述每个服务在提要中出现的次数。代码如清单7所示。

清单 7. 创建统计 XML

def stats(map:HashMap[String,Int]):Node = {
  var nodes = new Queue[Node]()
  map.foreach{(nvPair) =>
nodes += <Service id={nvPair._1} cnt={nvPair._2.toString}/>
  }
  return <Stats>{nodes}</Stats>
}

您的函数要求 HashMap 的键是服务的名称,其值为服务在 FriendFeed 中出现的次数。这个函数使用熟悉的 foreach-closure 风格遍历 HashMap,然后使用 HashMap 的名称/值对创建一个新节点,将这个节点添加到节点队列中。随后创建 Stats 结构并作为动态数据访问节点队列,节点队列随后被赋值给一个 XML 结构。现在准备好了所有函数,您只需驱动程序以便进行测试。

运行和测试

在运行程序之前,需要加入一些代码来驱动它。将创建一个 main 方法,就像使用 Java 编程一样,如清单8所示。

清单 8. FriendFeed main 方法

def main(args:Array[String]) = {
val feedXml = friendFeed
var map = new HashMap[String,Int]
args.foreach{(serviceName) =>
 val filteredEntries = filterFeed(feedXml, serviceName)
 var users:Node = <UserList/>
 filteredEntries.foreach{(user) =>
users = add(users, user)
 }
 map += serviceName -> filteredEntries.length
 println(results(serviceName,filteredEntries.length,users))
}
println(stats(map))
}

这个方法创建了 FriendFeed。它接受命令行参数确定哪些服务查找用户并计算统计数据。注意这些语法与 Java 语法非常相似。main 函数接受一个 String 数组(称为 args)作为参数。这个程序为统计文档创建 HashMap,并且为每个服务创建 UserList 文档。然后输出每个 UserList 和统计文档。要运行这个程序,需要使用 scalac FriendFeed.scala 和 scala FriendFeed 进行编译,如清单9所示。

清单 9. 运行程序

$ scalac FriendFeed.scala
$ scala FriendFeed googlereader flickr delicious twitter blog
<Service id="twitter"><UserList><nickname>ntamaoki</nickname>
<nickname>terrazi</nickname><nickname>ntamaoki</nickname>
<nickname>terrazi</nickname><nickname>ntamaoki</nickname>
<nickname>parodi</nickname><nickname>trevor</nickname>
<nickname>cindy</nickname><nickname>christinelu</nickname>
<nickname>clint</nickname><nickname>savvyauntie</nickname>
<nickname>44gi</nickname></UserList></Service>
<Serviceid="blog"><UserList><nickname>nechipor</nickname>
<nickname>mdolla</nickname><nickname>kyhpudding</nickname>
<nickname>hanayuu</nickname><nickname>hanayuu</nickname>
</UserList></Service><Stats><Service cnt="12" id="twitter">
</Service><Service cnt="0" id="delicious"></Service><Service
cnt="0" id="flickr"></Service><Service cnt="0" id="googlereader">
</Service><Service cnt="5" id="blog"></Service></Stats>

您当然可以选择不同的服务名称作为命令行参数或其他参数。Scala 具备完美的 printer 类,可以使用正确的空格、制表符和格式打印 XML。还提供了 XML 写入程序(writer)将 XML 写回数据流,比如文件。您可以使用 Scala 完成所有普通的任务,同时还可以使用 Scala 提供的一些独有的功能。

结束语

许多人把 Scala 视为 Java 编程语言发展历程中的重要一步。XML 已经成为一种重要的技术,编程语言只有在其语法中内置了 XML 支持,才能自然地应用 XML 技术。而 Scale 做到了这一点。它使得复杂问题变得简单。查看本文使用 Scale 执行的所有功能,想像一下做同样的事情需要使用多少行 Java 代码。

【编辑推荐】

  1. XML在Web应用中的优势
  2. 用XML和XSL来生成动态页面
  3. 在ASP.NET中使用Treeview控件和XML
【责任编辑:夏宗繁 TEL:(010)68476606】

内容导航
 第 1 页:解析XML  第 2 页:导航和模式匹配
 第 3 页:创建XML

分享到:

网友评论TOP5

查看所有评论(

提交评论

栏目热门

更多>>

  1. 专题:JVM编程语言,你的选择?
  2. 宅男程序员给老婆课程之11:域模型

文章排行

本月本周24小时

热点专题

更多>>

读书

Cisco CCNA 640-801
Cisco 640-801 Cisco® Certified Network Associate (CCNA®) Q&A with explanations Version 93.0

51CTO旗下网站

领先的IT技术网站 51CTO 领先的中文存储媒体 WatchStor 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 移动互联网生活门户 灵客风LinkPhone