http://blog.csdn.net/lovehuangjiaju/article/details/47682795
Scala提供了对XML的原生支持,通过scala.xml._包下的类或对象可以进行任何的XML操作。
XML的结构见 http://www.jianshu.com/p/c1eae6c3c8cb
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
}
}