`
mwei
  • 浏览: 121812 次
  • 性别: Icon_minigender_1
  • 来自: 抽象空间
社区版块
存档分类
最新评论

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>,然后判断、打印。
两个投影函数 \ 与 \\ 称作姊妹函数,我认为前者一个反斜线,叫做“影一”,后者叫做“影二”吧,这样也好记;
这两个函数的区别在于“影一”不进行深度查找,只对兄弟元素、姐妹属性查找,算是广度查找;后者则进行深度查找。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics