scala XML操作

作者: 点点渔火 | 来源:发表于2017-07-21 15:47 被阅读0次

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

Scala提供了对XML的原生支持,通过scala.xml._包下的类或对象可以进行任何的XML操作。

XML的结构见 http://www.jianshu.com/p/c1eae6c3c8cb
XML的要素: 声明文件(可选), 根元素(必选), 元素, 属性, 属性值(必须引号),
注释

xml的要素

scala.xml 的几个重要类:

  • Node类。它的一个抽象类,用于对象XML中的所有节点进行抽象:
  • Text类,仅包含文本的节点中文本的对象类型
  • NodeSeq类,它同样是一个抽象类,指的是节点的序列(可以是多个节点元素, 也可以是一个节点元素),Node继承自NodeSeq,可以看Node可作是NodeSeq只有一个元素的情况。

代码:


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模式匹配语法,利用{}进行匹配
      case <persons>{sub_element}</persons>=> println(sub_element)
      //其它未匹配的情况
      case _ => println("no matching")
    }
  }

  def xmlMatching2()={
    node match {
      //XML模式匹配语法,利用{}进行匹配

        // 一个子元素
      case <persons>{sub_element}</persons>=>
        println(sub_element)
        // 多个子元素
      case <persons>{sub_element @ _*}</persons>=>
      {
        println(sub_element)
        // 多个子元素 返回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格式, 这个会报错, 提取纯文本建议使用Jsoup
    node.text.trim
  }

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

    println("提取二级元素")
    //张三李四
    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>摇摆少年梦</name>
        |      <age>35</age>
        |    </person>
      """.stripMargin
    // 字符串转为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="摇摆少年梦" />  // XML元素文本为空时, 可以简写成这样
        <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转换为scala.xml.Elem类型
    XMLSerialization()
  }

  def XMLSerialization() = {
    // 构造XML(拼接)
    val p=new Person("摇摆少年梦",27)
    val xmlPerson = p.toXML()

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

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

    // 反序列化XML(解析))
    val p2=p.fromXML(loadPerson)
    println(p2)
    //下面这条语句的执行结果:
    // <person><name>摇摆少年梦</name></person>
    // 一个子元素 Node类型, 可以匹配

    new xmlMatch(<persons><person><name>摇摆少年梦</name></person></persons>).xmlMatching
    //下面这条语句的执行结果:
    //no matching
    // 多个子元素 即子元素构成NodeSeq, 不能匹配
    new xmlMatch(<persons><person><name>摇摆少年梦</name></person><person><name>摇摆少年梦</name></person></persons>).xmlMatching2
  }
}

相关文章

网友评论

    本文标题:scala XML操作

    本文链接:https://www.haomeiwen.com/subject/ojqrhxtx.html