scala对xml的支持很强大,这是大家都知道的
下面通过网络搜索,以及自身实践,来体验它到底有多么强大!
object XmlTest { def main(args: Array[String]) { val xmlTag = <div> <span id="12">Hi,How are you!</span> <div> <span>I am Good!</span> <span></span> </div> </div> println(xmlTag \ "span" \ "@id") //12 println(xmlTag \ "span") //得到root标签下的span <span id="12">Hi,How are you!</span> println(xmlTag \\ "span") // <span id="12">Hi,How are you!</span><span>I am Good!</span>... 得到所有span println(xmlTag getClass) //scala.xml.Elem println(xmlTag \ "span" getClass) //scala.xml.NodeSeq$$anon$1 println(<dd>{ xmlTag \\ "span" }</dd>) //<dd><span id="12">Hi,How are you!</span><span>I am Good!</span><span></span></dd> } }
利用xml进行match case的网页:http://haolloyin.blog.51cto.com/1177454/395748
若果想自己串联出一个xml则可以用下面这样的方式:
var nodes=new Queue[NodeSeq] val xmlElement= xmlTag \ "span" nodes += xmlElement nodes += <a> </a> //通过一个Queue,将xml的NodeSql连接起来 println(<di> {nodes}</di>) //<di> <span id="12">Hi,How are you!</span><a> </a></di>
如果想在root标签里做些手脚:
xmlTag \ "_" //可以去除root标签下面的所有内容 var nodes=new Queue[NodeSeq] nodes += xmlTag \ "_" nodes += <a> Why </a> //通过一个Queue,将xml的NodeSql连接起来 println(<div> {nodes}</div>) //完成了在root标签的直接子标签尾巴添加一个tag
按照上面的方法,就可以利用层次结构,利用多个 \ ".."来修改xml的内容,当然随着层数的增加,就不只需要一个Queue了!
由于我还没有发现scala有类似toElem这样的方法,可以将string转换成Elem,不能利用string的replace方法来替换找到的Node,所以除了使用类似java解析xml的方式,处理变更xml内的小标签的有效方法还没有找到,希望知道的同学告诉下。
下面使用遍历Elem的每个node的方法来改变xml,具体解决请看下面这个完整的Object
import collection.mutable.Queue import xml.{NodeSeq, Elem} object XmlTest { def main(args: Array[String]) { val xmlTag = <div> <span id="12">Hi,How are you!</span> <div> <span>I am Good!</span> <span></span> </div> </div> // println(xmlTag \ "span" \ "@id") //12 // println(xmlTag \ "_" \"div") //可以去除root标签下面的所有内容 var nodes = new Queue[NodeSeq] val its = xmlTag.child for (it <- its) { if (it.toString != "\n ") { //为什么是 "\n "呢,因为声明的xmlTag使用工具格式化了一下,分布在多行 nodes += it.asInstanceOf[NodeSeq] if (it.attribute("id") != None && it.attribute("id").get.apply(0).text == "12") nodes += <span>Sorry,Something is wrong</span> } } println(<div> {nodes} </div>) //结果: <div> <span id="12">Hi,How are you!</span><span>Sorry,Something is wrong</span><div> <span>I am Good!</span> <span></span> </div> </div> } }
至于还有一个遍历NodeSeq的方式,就不具体附代码了,应该是大同小异,参见scala的xml包了。
本文出自 “沐浴心情” 博客,请务必保留此出处http://lj3331.blog.51cto.com/5679179/1020702