Scala: handle XML

Scala对XML文档的处理是如此简洁,代码摘自动物世界-马来貘那本,稍做改动,如下:

import scala.xml._
object XMLhandler {
val someXML=
<sammich>
<bread>wheat</bread>
<meat>salami</meat>
<condiments>
<condiment expired="true">mayo</condiment>
<condiment expired="false">mustard</condiment>
</condiments>
</sammich>

def main(args:Array[String]):Unit={
someXML match{
case <sammich>{ingredients @ _*}</sammich>=>{
for(<condiments>{ conds @ _*}</condiments> <- ingredients; cond<-conds){
if((cond \ "@expired").text=="true")
println("1: "+cond.text+" has expired!!")
}
}
} //end match

for(condiment<- (someXML \\ "condiment")){
if((condiment \ "@expired").text=="true")
println("2: "+condiment.text+" has expired!!")
}
}
}

output:
1: mayo has expired!!
2: mayo has expired!!

说明:
很显然这里使用了模式匹配,case里的ingredients直接提取了XML片段的<condiments>元素(包括自身和其内部元素);
第一个for循环里conds提取了两个<condiment>元素,然后对每个<condiment>元素借助cond遍历,
然后在if里使用投影函数(projection function)反斜线(\)找到expired属性,这个属性类型是scala.xml.NodeSeq,
调用这个类型的text方法取得属性值("true","false"),然后打印过期的调料。
第二个for循环使用另一投影函数双反斜线(\\)直接提取深层子元素<condiment>,然后判断、打印。
两个投影函数 \ 与 \\ 称作姊妹函数,我认为前者一个反斜线,叫做“影一”,后者叫做“影二”吧,这样也好记;
这两个函数的区别在于“影一”不进行深度查找,只对兄弟元素、姐妹属性查找,算是广度查找;后者则进行深度查找。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值