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
}
}