日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

Scala入门到精通——第二十七节 Scala操纵XML

發布時間:2024/1/23 asp.net 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Scala入门到精通——第二十七节 Scala操纵XML 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本節主要內容

  • XML 字面量
  • XML內容提取
  • XML對象序列化及反序列化
  • XML文件讀取與保存
  • XML模式匹配
  • 1. XML 字面量

    XML是一種非常重要的半結構化數據表示方式,目前大量的應用依賴于XML,這些應用或利用XML作為數據交換格式,或利用XML進行文件配置等。像Java、C++及其它流行的程序開發語言都是依賴于第三方庫來實現XML的操作,例如JAVA經常通過JDOM,DOM4J等XML處理工具進行XML的操縱,但Scala提供了對XML的原生支持,通過scala.xml._包下的類或對象可以進行任何的XML操作。下面的代碼演示了Scala中如何定義XML字面量。

    scala> var x: scala.xml.Elem = <site><name>xuetuwuyou</name><url>http://www.xuet uwuyou.com/</url></site> x: scala.xml.Elem = <site><name>xuetuwuyou</name><url>http://www.xuetuwuyou.com/ </url></site>scala> <site><name>xuetuwuyou</name><url>http://www.xuetuwuyou.com/</url></site>res8: scala.xml.Elem = <site><name>xuetuwuyou</name><url>http://www.xuetuwuyou.c om/</url></site>

    通過上面的代碼不難發現,scala會自動地對XML進行解析,并識別為scala.xml.Elem類型。scala中與XML相關的包和類很多,具體如下圖所示:

    在深入講解Scala操縱XML之前,先對幾個主要的術語進行介紹:

    圖中描述了屬性、根元素、子元素、元素及文本的概念及它們之間的關聯關系,所有的文本、元素被統稱為節點(Node)。下面給出的scala XML中的幾個重要的類:

    • Node類。它的一個抽象類,用于對象XML中的所有節點進行抽象:
    • Text類,僅包含文本的節點,例如<url>http://www.xuetuwuyou.com/</url> 中的http://www.xuetuwuyou.com/就是一種Text對象
    • NodeSeq類,它同樣是一個抽象類,指的是節點的序列,Node繼承自NodeSeq,可以看Node可作是NodeSeq只有一個元素的情況。

    scala中的XML中可以執行scala表達式,例如

    val s="http://www.xuetuwuyou.com/"val xmlUrl= <a>{" "+s+" "}</a>//<a> http://www.xuetuwuyou.com/ </a>println(xmlUrl)val age=30val xml1= if(age<29) <age> {age} </age> else NodeSeq.Empty//<age> 28 </ageprintln(xml1)//<age> 79 </age>val xml2= <age> {29+50} </age>println(xml2)

    2. XML內容提取

    提取XML中的文本:

    object ExtractXMLText extends App{val x= <person><name>搖擺少年夢</name><age>27</age></person>//搖擺少年夢27println(x.text) }

    這種提取方式將XML中所有的文本內容提取出來并拼接在一起,在實際中我們可能需要精確提取,比如我只想提取name元素中的內容,此時可以采用下列方式:

    val x= <person><name>搖擺少年夢</name><age>27</age></person> //提取name子結點,類型XPATH訪問方式 //<name>搖擺少年夢</name>println(x \ "name") //<name>搖擺少年夢</name> //提取name中的文本println((x \ "name").text) //搖擺少年夢scala> x \ "age" res2: scala.xml.NodeSeq = NodeSeq(<age>27</age>)

    x \ “age” 這種子元素的提取方式,返回的類型是scala.xml.NodeSeq

    \的方式只能提取子元素,不能提取子元素的子元素,例如:

    val x= <persons><person><name>搖擺少年夢</name><age>27</age></person><person><name>張三</name><age>29</age></person><person><name>李四</name><age>30</age></person></persons>//返回空NodeSeqprintln(x \ "name")// \\提取二級子元素//<name>搖擺少年夢</name><name>張三</name><name>李四</name>println(x \\ "name")

    通過\和\\可以提取任何XML的子元素及其文本內容,但如果XML元素帶有屬性,那又如何提取呢?

    val x= <persons><person name="搖擺少年夢" age="27" /><person><name>張三</name><age>29</age></person><person><name>李四</name><age>30</age></person></persons>//用@方式提取name屬性//搖擺少年夢println(x \\ "@name")

    3. XML對象序列化及反序列化

    下面給出的是對象的XML序列化操作:

    class Person(val name:String,val age:Int){def toXML()={<person><name>{name}</name><age>{age}</age></person>} } object XMLSerialization extends App{val p=new Person("搖擺少年夢",27)println(p.toXML()) }

    反序列化操作:

    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 } object XMLSerialization extends App{val p=new Person("搖擺少年夢",27)val xmlPerson=p.toXML()val p2=p.fromXML(xmlPerson)println(p2) }

    4. XML文件讀取與保存

    前一小節,我們的序列化與反序列化操作都在內存中進行的,在通常的情況下都是將序列化后的XML保存在文件當中,在反序列化時再從文件中讀取,實現方式如下:

    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 } object XMLSerialization extends App{val p=new Person("搖擺少年夢",27)val xmlPerson=p.toXML()//保存到XML文件當中scala.xml.XML.save("person.xml", xmlPerson, "UTF-8", true, null)//從文件中加載XML文件val loadPerson=scala.xml.XML.loadFile("person.xml")val p2=p.fromXML(loadPerson)println(p2) }

    下面給出的是save方法的標簽

    /** Saves a node to a file with given filename using given encoding* optionally with xmldecl and doctype declaration.** @param filename the filename* @param node the xml node we want to write* @param enc encoding to use* @param xmlDecl if true, write xml declaration* @param doctype if not null, write doctype declaration*/final def save(filename: String,node: Node,enc: String = encoding,xmlDecl: Boolean = false,doctype: dtd.DocType = null): Unit =

    5. XML模式匹配

    Scala操縱XML另外一個非常強大的地方在于,它能夠用于模式匹配,從而非常靈活、方便地對XML進行處理:

    import scala.xml._object PatternMatchingXML extends App{def xmlMatching(node:Node)={node match {//XML模式匹配語法,利用{}進行匹配case <persons>{sub_element}</persons>=> println(sub_element)//其它未匹配的情況case _ => println("no matching")}}//下面這條語句的執行結果:<person><name>搖擺少年夢</name></person>xmlMatching(<persons><person><name>搖擺少年夢</name></person></persons>)//下面這條語句的執行結果://no matchingxmlMatching(<persons><person><name>搖擺少年夢</name></person><person><name>搖擺少年夢</name></person></persons>) }

    從上述代碼可以看到,<persons>{sub_element}</persons> 只能匹配標簽<persons></persons> 中只存在單個子元素的情況,如果具有多個子元素,即子元素構成NodeSeq,則不能匹配,需要進行進一步處理,代碼如下:

    object PatternMatchingXML extends App{def xmlMatching(node:Node)={node match {//_*的方式表示可以匹配多個子元素的情況,如果匹配//則將匹配的內容賦值給sub_element case <persons>{sub_element @ _*}</persons>=> println(sub_element)case _ => println("no matching")}}//下面這條語句返回的是:ArrayBuffer(<person><name>搖擺少年夢</name></person>)//數組中的每個元素都是Node類型xmlMatching(<persons><person><name>搖擺少年夢</name></person></persons>)//下面這條語句返回的是:ArrayBuffer(<person><name>搖擺少年夢</name></person>, <person><name>搖擺少年夢</name></person>)//數組中的每個元素都是Node類型xmlMatching(<persons><person><name>搖擺少年夢</name></person><person><name>搖擺少年夢</name></person></persons>) }

    因為返回的是ArrayBuffer,可以通過for循環遍歷對XML子元素中的內容進行提取,如:

    def xmlMatching2(node:Node)={node match {case <persons>{sub_element @ _*}</persons>=> for(elm <- sub_element) println("getting "+(elm \ "name").text)case _ => println("no matching")}}//返回結果getting 搖擺少年夢xmlMatching2(<persons><person><name>搖擺少年夢</name></person></persons>)//返回結果://getting 搖擺少年夢//getting 搖擺少年夢xmlMatching2(<persons><person><name>搖擺少年夢</name></person><person><name>搖擺少年夢</name></person></persons>)

    總結

    以上是生活随笔為你收集整理的Scala入门到精通——第二十七节 Scala操纵XML的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产精品丝袜视频 | 久久久免费精品 | 91视频网址| jizz视频在线观看 | 性chinese天美传媒麻 | 91精品视频免费在线观看 | 精品人妻一区二区三区久久 | 天天干少妇 | 97国产在线 | 美美女高清毛片视频免费观看 | 国产精品毛片一区二区在线看舒淇 | 国产精品一区二区三区在线看 | 久久成人免费视频 | 婷婷六月在线 | www.午夜视频| 欧美性生活免费视频 | 国产视频一区二区三 | 日批视屏| www视频免费在线观看 | 欧美xxxxx视频 | 久久久精品中文字幕 | 国产精品一级片在线观看 | 在线免费观看黄色网址 | 美女啪啪av| 欧美成年人视频 | 国产欧美精品aaaaaa片 | 日韩不卡在线 | 欧美三级韩国三级日本三斤 | wwwxxxx国产| 精品久久人人妻人人做人人 | 91伊人网 | 黑人极品ⅴideos精品欧美棵 | 在线视频日韩欧美 | 99国产精品一区二区 | av在线电影网 | 99国产精品免费 | 男女午夜爽爽爽 | 中文字幕+乱码+中文字幕一区 | 中文字幕黑丝 | 冈本视频在线观看 | 天堂网一区二区三区 | 国产99精品 | 骚黄网站| 最近中文字幕在线观看视频 | 色屁屁在线| 美女久久视频 | 人人插人人草 | 亚洲精品视频在线 | 日韩中文字幕av在线 | 99在线观看免费视频 | 亚洲欧美精品一区二区 | 久久国产免费 | 日日撸夜夜操 | 亚洲美女自拍 | 日韩免费观看一区二区 | 91在线精品视频 | 好男人视频www | 久久婷婷国产麻豆91 | 欧美 日韩 国产 激情 | 免费av成人 | 精品一二三区 | 极品人妻一区二区三区 | 中文字幕在线观看视频网站 | 884aa四虎影成人精品一区 | yjizz视频| 丁香激情综合 | 亚洲成人麻豆 | 日韩在线视频二区 | 中文字幕亚洲一区 | 国产成人精品一区二区无码呦 | 国产精品二区一区二区aⅴ 一卡二卡三卡在线观看 | 久久久久人 | 欧美日本精品 | 成人免费av片 | 高潮白浆 | 免费看国产精品 | 亚洲av乱码久久精品蜜桃 | 国产精品午夜福利 | 久久久久久久黄色片 | 日本二区三区视频 | 韩国成人在线 | 国产极品视频在线观看 | 娇妻玩4p被三个男人伺候电影 | 亚洲v日本| 国产性生活网站 | 亚洲交性网 | 一区二区美女视频 | 亚洲拍拍视频 | 欧美激情久久久 | 2一3sex性hd | 激情999| 国产亚洲精品久久久久久久 | 国产真人无码作爱视频免费 | 午夜影院0606 | se欧美| 蜜臀av性久久久久蜜臀aⅴ | 超碰97成人| 国产淫视 | 国产男女猛烈无遮挡a片漫画 |