scala操作XML相比java还有c++等是比较方便的,毕竟内置了对XML的操作。

对XML配置文件的读取来说比较友好的解决。

以下是对XML操作的简单演示(注释主要在代码中):

1、读取XML文件

2、打印XML中的内容

3、按照标签名读取XML中的值和属性  \、 \\、  \@

4、序列化和反序列化

5、模式匹配   match

6、简单保存XML文件   save

 

package main.scala.XMLTest

import scala.xml._
//导入包
/**
  * Created by postbird on 2016/9/20.
  */
//序列化例子来源:
//http://blog.csdn.net/lovehuangjiaju/article/details/47682795
class Person(val name:String,val age:Int){
    //序列化操作
    def toXML()={
        
            {name}
            {age}
        
    }
    //反序列化操作
    def fromXML(xml:scala.xml.Elem):Person={
        new Person((xml \"name").text,(xml \"age").text.toInt)
    }
    //
    override def toString()={
        name+" : "+age
    }
}
object XMLTest1 {
    def main(args: Array[String]) {

        //加载xml文件
        val configXML = XML.load("conf.xml")

/****************** 加载xml 文件 *********************************/

        //        得到的是 class scala.xml.Elem
        println(configXML)
        //得到整个文件内容
        //        
        //            127.0.0.1
        //            root
        //            123456
        //            test
        //            3306
        //        

/************************** 执行表达式 ********************************/

        //执行表达式
        println("数据库用户名 :" + (configXML \ "dbuser").text)
        // \的方式只能提取子元素,不能提取子元素的子元素
        //  \\ 可以提取二级子元素
        // .text输出内容
        //        数据库用户名 :root
        println("二级子元素:" + (configXML \\ "admin").text)
        //        其他 :postbird

/**************************提取有属性的xml元素使用@******************************/

        //提取有属性的xml元素使用@
        println("属性测试:" + (configXML \\ "info" \ "@type"))
        //        属性测试:link
        // 如果有多个属性  使用 "info"\"@type" 这种形式

/**************************序列化操作 和反序列化操作*****************************/

        //        序列化操作  使用类 Person
        val p = new Person("postbird", 21)
        println(p.toXML())
        //        
        //            postbird
        //            21
        //        
        println(p.fromXML(p.toXML()).toString())
//        postbird : 21

 /************************保存xml到文件中***************************************/
        scala.xml.XML.save("person.xml",p.toXML(),"UTF-8",true,null)

//        save 方法 :
//        final def save(
//            filename: String,      //文件名
//            node: Node,           //内容
//            enc: String = encoding, //编码
//            xmlDecl: Boolean = false,  //是否进行文件的声明 默认是 false
//            doctype: dtd.DocType = null //dtd
//          ): Unit ={}

//          输出的文件内容
//        
//          
//              postbird
//              21
//          

/************************xml 的模式匹配***************************************/
    //如果匹配的时候不用  @_*
//  只能匹配 node中的一个子元素的情况

        def xmlMatch(node:Node): Unit ={
            node match{
                    //使用  @_* 可以匹配多个子元素的情况
//                    不适用  &_*  会输出 no matching...
//              case {nodes @_*}=>println(nodes)
                //使用 foreach 进行遍历的情况
                case {nodes @_*}=>
                    nodes.foreach{
                       x=>(x\\"other").toArray.foreach(y=>println("node"+y))
                    }
                case _=>println("no matching....")
            }
        }
        //使用函数
//        println(configXML)
        xmlMatch(configXML)
//        node
//          postbird
//            http://www.ptbird.cn
//        
    }
}