scala XML操作

http://blog.csdn.net/lovehuangjiaju/article/details/47682795

Scala提供了對(duì)XML的原生支持,通過scala.xml._包下的類或?qū)ο罂梢赃M(jìn)行任何的XML操作。

XML的結(jié)構(gòu)見 http://www.itdecent.cn/p/c1eae6c3c8cb
XML的要素: 聲明文件(可選), 根元素(必選), 元素, 屬性, 屬性值(必須引號(hào)),
注釋

xml的要素

scala.xml 的幾個(gè)重要類:

  • Node類。它的一個(gè)抽象類,用于對(duì)象XML中的所有節(jié)點(diǎn)進(jìn)行抽象:
  • Text類,僅包含文本的節(jié)點(diǎn)中文本的對(duì)象類型
  • NodeSeq類,它同樣是一個(gè)抽象類,指的是節(jié)點(diǎn)的序列(可以是多個(gè)節(jié)點(diǎn)元素, 也可以是一個(gè)節(jié)點(diǎn)元素),Node繼承自NodeSeq,可以看Node可作是NodeSeq只有一個(gè)元素的情況。

代碼:


class Person(val name:String,val age:Int){
  /*
  序列化/反序列化操作
   */
  //序列化操作
  def toXML()={
    <person>
      <name>{name}</name>
      <age>{age}</age>
    </person>
  }
  //反序列化操作
  def fromXML(xml:scala.xml.Elem):Person={
    new Person((xml \ "name").text,(xml \ "age").text.toInt)
  }
  override def toString()="name="+name+", age="+age
}

class xmlMatch(val node:scala.xml.Elem){
  /*
  模式匹配
   */
  def xmlMatching()={
    node match {
      //XML模式匹配語法,利用{}進(jìn)行匹配
      case <persons>{sub_element}</persons>=> println(sub_element)
      //其它未匹配的情況
      case _ => println("no matching")
    }
  }

  def xmlMatching2()={
    node match {
      //XML模式匹配語法,利用{}進(jìn)行匹配

        // 一個(gè)子元素
      case <persons>{sub_element}</persons>=>
        println(sub_element)
        // 多個(gè)子元素
      case <persons>{sub_element @ _*}</persons>=>
      {
        println(sub_element)
        // 多個(gè)子元素 返回ArrayBuffer
        for(elm <- sub_element) println("getting "+(elm \ "name").text)

      }
      //其它未匹配的情況
      case _ => println("no matching"); None
    }
  }
}

class xmlSaveLode() extends App {
  def saveXml(fileName:String, x:scala.xml.Elem): Unit ={
    scala.xml.XML.save(fileName, x, "UTF-8", true, null)
  }
  def loadXml(fileName:String):scala.xml.Elem = {
    val loadPerson=scala.xml.XML.loadFile(fileName)
    loadPerson
  }
}

class xmlParse(node: scala.xml.Elem) extends App {
  def sureTxt(): String={
    println("提取純文本")
    println(node.text)  // 如果XML不正確或者是HTML格式, 這個(gè)會(huì)報(bào)錯(cuò), 提取純文本建議使用Jsoup
    node.text.trim
  }

  def childElement() = {
    // 提取子元素, 類型XPATH的訪問方式
    // 3
    println("提取子元素")
    val num: scala.xml.NodeSeq = node \ "head_num"
    println(num.text.toInt)

    println("提取二級(jí)元素")
    //張三李四
    val name: scala.xml.NodeSeq = node \\ "name"
    println(name)
    println(name(0))
    name.foreach(println)
    println(name.text)
  }

  def getProperty() = {
    println("提取屬性")
    println(node \ "animal" \ "@ts")
    println(node \ "person" \ "@ts")
    println(node \\ "@ts")
  }

  def txtToXml(): scala.xml.Elem = {
    val p =
      """
        |<person>
        |      <name>搖擺少年夢(mèng)</name>
        |      <age>35</age>
        |    </person>
      """.stripMargin
    // 字符串轉(zhuǎn)為scala.xml.Elem
    scala.xml.XML.loadString(p)
  }
}


object ParseXml extends App{
  override def main(args: Array[String]) {
    val x: scala.xml.Elem= <persons>
      <head_num>3</head_num>
      <person>
        <lias ts="搖擺少年夢(mèng)" />  // XML元素文本為空時(shí), 可以簡(jiǎn)寫成這樣
        <name>張三</name>
        <age>29</age>
      </person>
      <person>
        <name>李四</name>
        <age>30</age>
      </person>
      <animal ts="亂入">貓</animal>
    </persons>
    // scala.xml.Elem 類型變量的解析
    val p = new xmlParse(x)
    p.sureTxt()
    p.childElement()   // 子元素直接XPATH來解析
    p.getProperty()    // 屬性 @來解析
    p.txtToXml()       // String轉(zhuǎn)換為scala.xml.Elem類型
    XMLSerialization()
  }

  def XMLSerialization() = {
    // 構(gòu)造XML(拼接)
    val p=new Person("搖擺少年夢(mèng)",27)
    val xmlPerson = p.toXML()

    //保存到XML文件當(dāng)中
    val xmlIo = new xmlSaveLode()
    xmlIo.saveXml("person.xml", xmlPerson)

    //從文件中加載XML文件
    val loadPerson = xmlIo.loadXml("person.xml")

    // 反序列化XML(解析))
    val p2=p.fromXML(loadPerson)
    println(p2)
    //下面這條語句的執(zhí)行結(jié)果:
    // <person><name>搖擺少年夢(mèng)</name></person>
    // 一個(gè)子元素 Node類型, 可以匹配

    new xmlMatch(<persons><person><name>搖擺少年夢(mèng)</name></person></persons>).xmlMatching
    //下面這條語句的執(zhí)行結(jié)果:
    //no matching
    // 多個(gè)子元素 即子元素構(gòu)成NodeSeq, 不能匹配
    new xmlMatch(<persons><person><name>搖擺少年夢(mèng)</name></person><person><name>搖擺少年夢(mèng)</name></person></persons>).xmlMatching2
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,654評(píng)論 19 139
  • 讀《快學(xué)Scala 》一書的摘要 Scala 運(yùn)行于JVM之上,擁有海量類庫和工具,兼顧函數(shù)式編程和面向?qū)ο蟆?在...
    abel_cao閱讀 1,380評(píng)論 0 8
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    草里有只羊閱讀 18,557評(píng)論 0 85
  • 元認(rèn)知沒開啟之前,我每天吃吃喝喝,眼睛一閉一睜,一天天就這么過去了,生活一如既往,工作平淡無奇,沒什么太大起伏,特...
    任家李拉拉閱讀 505評(píng)論 0 1
  • -1- 今天看到一則新聞,高考復(fù)讀生網(wǎng)約車拼車先送別人,遲到一分鐘被拒入場(chǎng)。學(xué)生稱司機(jī)曾半路回家拿東西而耽誤時(shí)間,...
    子豪同學(xué)c閱讀 238評(píng)論 0 0

友情鏈接更多精彩內(nèi)容