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