日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
使用Scala簡(jiǎn)化XML對(duì)象處理

本文使用了 Scala 編程語(yǔ)言,其版本為 2.6.1。作為一種新生語(yǔ)言,它仍在快速發(fā)展,因此需要了解它的最新進(jìn)展。本文并不要求讀者具備 Scala 知識(shí),而是嘗試介紹 Scala 的語(yǔ)法和術(shù)語(yǔ)。Scala 需要一個(gè) Java 虛擬機(jī)。本文使用 JDK 1.6.0_04,但 Scala 只需要 1.5 或更高版本。盡管本文沒(méi)有包含 Java 代碼,但是也要求讀者熟悉 Java 編程。

創(chuàng)新互聯(lián),為您提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、網(wǎng)站營(yíng)銷(xiāo)推廣、網(wǎng)站開(kāi)發(fā)設(shè)計(jì),對(duì)服務(wù)混凝土攪拌站等多個(gè)行業(yè)擁有豐富的網(wǎng)站建設(shè)及推廣經(jīng)驗(yàn)。創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司成立于2013年,提供專(zhuān)業(yè)網(wǎng)站制作報(bào)價(jià)服務(wù),我們深知市場(chǎng)的競(jìng)爭(zhēng)激烈,認(rèn)真對(duì)待每位客戶(hù),為客戶(hù)提供賞心悅目的作品。 與客戶(hù)共同發(fā)展進(jìn)步,是我們永遠(yuǎn)的責(zé)任!

解析 XML

首先探討如何使用 Scala 解析 XML。像大多數(shù)編程語(yǔ)言一樣,Scala 提供了多種 XML 解析方法。以下是一些基本的方法:基于表示的 InfoSet/DOM、push (SAX) 或 pull (StAX) 事件、與 JAXB(Java Architecture for XML Binding) 類(lèi)似的數(shù)據(jù)綁定。您將探討基于 DOM 的處理,因?yàn)樗菔玖?Scala 語(yǔ)法的眾多好處。在深入研究之前,您需要了解要解析的 XML 內(nèi)容以及對(duì)它執(zhí)行哪些操作。因此需要借助一個(gè)樣例應(yīng)用程序。

樣例應(yīng)用程序:FriendFeed

FriendFeed 是一個(gè)在 2008 年非常流行的 Web 服務(wù),它允許用戶(hù)在其他服務(wù)中聚合他們的行為,例如各種博客(blog)服務(wù)、即時(shí)信息傳遞服務(wù)、YouTube、Flickr 和 Twitter 等。然后從這種聚合中創(chuàng)建單獨(dú)的數(shù)據(jù)提要。您可以針對(duì)個(gè)人執(zhí)行上述操作,即對(duì)指定的人員實(shí)現(xiàn)聚合行為。盡管可能不是很有用,但是 FriendFeed 的公共提要非常有趣。它在所有 FriendFeed 用戶(hù)之間聚合所有的公共行為。FriendFeed 提供一個(gè) API 來(lái)訪(fǎng)問(wèn)個(gè)人提要和公共提要。您將編寫(xiě)一個(gè)應(yīng)用程序來(lái)訪(fǎng)問(wèn)和解析公共提要。

利用 Java 庫(kù)

您要做的首要事情是訪(fǎng)問(wèn) FriendFeed 的公共提要。其 URL 為 http://friendfeed.com/api/feed/public。默認(rèn)的情況下它以 JSON 格式顯示數(shù)據(jù)并且顯示最新的 30 個(gè)條目。要將其改為 XML 格式,添加查詢(xún)字符串參數(shù) format=xml。例如,要將條目數(shù)目改為 100,添加查詢(xún)字符串參數(shù) num=100 ?,F(xiàn)在您只需要訪(fǎng)問(wèn)這個(gè) URL。這在 Java 代碼中很容易實(shí)現(xiàn),因此在 Scala 代碼也很容易??匆幌?清單 1 中訪(fǎng)問(wèn) FriendFeed 公共提要的代碼。

清單 1. 訪(fǎng)問(wèn) FriendFeed

 
 
 
  1. object FriendFeed {  
  2.   import java.net.{URLConnection, URL}  
  3.   import scala.xml._   
  4.   def friendFeed():Elem = {  
  5.     val url = new URL("http://friendfeed.com/api/feed/public?format=xml&num=100")  
  6.     val conn = url.openConnection  
  7.     XML.load(conn.getInputStream)  
  8.   }  
  9. }  

注意,這里要做的第一件事就是導(dǎo)入兩個(gè)核心的 Java 類(lèi)。 Scala 不必使用自己的 API 執(zhí)行諸如打開(kāi) HTTP 連接之類(lèi)的操作,因?yàn)樗梢岳?Java 的 API 來(lái)解決這個(gè)問(wèn)題。注意 Scala 為從同一包導(dǎo)入多個(gè)類(lèi)提供了捷徑。下一行導(dǎo)入 Scala 的核心 XML 類(lèi)。下劃線(xiàn)就像 Java 中的星號(hào)一樣,它導(dǎo)入 scala.xml 包中的所有類(lèi)。

因此使用 Java 的 API 打開(kāi)一個(gè)到 FriendFeed 的 HTTP 連接。接下來(lái)使用 Scala 的 XML對(duì)象進(jìn)行解析。這里有很多有趣的現(xiàn)象。首先,XML 是一個(gè) Scala 對(duì)象,即它是一個(gè)單例(singleton)對(duì)象。Scala 沒(méi)有靜態(tài)的方法、字段和初始化程序。相反您可以定義一個(gè)對(duì)象(而不是類(lèi))并且它將成為類(lèi)的一個(gè)單例實(shí)例。您可以像調(diào)用靜態(tài)方法一樣訪(fǎng)問(wèn)單例對(duì)象的方法。這就是 XML.load 語(yǔ)句的作用。注意,盡管這是一個(gè) Scala 對(duì)象的方法,它接受一個(gè) Java 對(duì)象(java.io.InputStream)作為參數(shù)。這正體現(xiàn)了 Scala 和 Java 之間的緊密聯(lián)系。最后要注意沒(méi)有返回語(yǔ)句。返回語(yǔ)句在 Scala 中是可選的。如果沒(méi)有返回語(yǔ)句,將返回對(duì)方法的最后一個(gè)語(yǔ)句的求值(如果可行并且 Scala 沒(méi)有返回編譯錯(cuò)誤的話(huà))。現(xiàn)在可以很簡(jiǎn)單地訪(fǎng)問(wèn) 清單 1 中的方法,如 清單 2 所示。

清單 2. 訪(fǎng)問(wèn) friendFeed 方法 

 
 
 
  1. val feedXml = friendFeed 

注意在調(diào)用 friendFeed 的方法時(shí)沒(méi)有必要使用圓括號(hào)。您也可以使用 Scala 的類(lèi)型接口。您沒(méi)有必要聲明 feedXml 的類(lèi)型,因?yàn)樗怯?friendFeed 方法的返回類(lèi)型推斷出來(lái)的。再次查看 清單 1 并了解它如何利用語(yǔ)法捷徑。最后要注意的是您所解析的 XML 對(duì)象被聲明為 val。這使其成為不可變的對(duì)象(像 Java 代碼中的字符串),這在 Scala 中是很常見(jiàn)的。把 XML 作為一個(gè)不可變的對(duì)象有很多優(yōu)點(diǎn),但是如果您習(xí)慣在 DOM 中使用 appendChild API,那么則很難適應(yīng)這一點(diǎn)?,F(xiàn)在已經(jīng)從 FriendFeed 中解析了 XML,可以開(kāi)始使用 Scala 對(duì)其劃分。

#p#

導(dǎo)航和模式匹配

許多編程語(yǔ)言將 XML 表示為 DOM 樹(shù)。這個(gè)方法有許多優(yōu)點(diǎn),但是不利于以編程的方式遍歷樹(shù)來(lái)從 XML 文檔中提取數(shù)據(jù)。Java 技術(shù)提供了可以利用 XPath 語(yǔ)法的庫(kù)。Scala 采取相似的方法,但它有許多優(yōu)點(diǎn)。Scala 在這個(gè)方法中體現(xiàn)了很多函數(shù)語(yǔ)言特征。在 Scala 中沒(méi)有使用操作符(像 + 或 *)。相反,使用 + 或 * 等符號(hào)定義可以執(zhí)行普通數(shù)字加減法的函數(shù)。這也意味著您可以定義任何類(lèi)型的操作符(因?yàn)樗鼈儗?shí)際上就是函數(shù))。這些操作符號(hào)比 C++ 這類(lèi)語(yǔ)言中的重載操作符具有更強(qiáng)大的功能。在 XPath 中,由于可以被轉(zhuǎn)換成一個(gè)函數(shù)調(diào)用,您可以在 Scala 中直接應(yīng)用 XPath 語(yǔ)法的某一部分。

了解了這些內(nèi)容,我們來(lái)看一下 FriendFeed 中的 XML 是什么樣子。清單 3 提供了一個(gè)例子。

清單 3. FriendFeed XML 示例

 
 
 
  1. < feed> 
  2.     < entry> 
  3.         < updated>2008-03-26T05:06:36Z< /updated> 
  4.         < service> 
  5.             < profileUrl>http://twitter.com/karlerikson< /profileUrl> 
  6.             < id>twitter< /id> 
  7.             < name>Twitter< /name> 
  8.         < /service> 
  9.         < title>Listening to Panic at the Disco on Kimmel< /title> 
  10.         < link>http://twitter.com/karlerikson/statuses/777188586< /link> 
  11.         < published>2008-03-26T05:06:36Z< /published> 
  12.         < id>f18ebf10-06be-98e2-6059-fa78fa44584b< /id> 
  13.         < user> 
  14.             < profileUrl>http://friendfeed.com/karlerikson< /profileUrl> 
  15.             < nickname>karlerikson< /nickname> 
  16.             < id>f294a86c-e6f3-11dc-8203-003048343a40< /id> 
  17.             < name>Karl Erikson< /name> 
  18.         < /user> 
  19.     < /entry> 
  20.     < entry> 
  21.         < updated>2008-03-26T05:06:35Z< /updated> 
  22.         < service> 
  23.             < profileUrl>http://twitter.com/asfaq< /profileUrl> 
  24.             < id>twitter< /id> 
  25.             < name>Twitter< /name> 
  26.         < /service> 
  27.         < title>@ceetee lol< /title> 
  28.         < link>http://twitter.com/asfaq/statuses/777188582< /link> 
  29.         < published>2008-03-26T05:06:35Z< /published> 
  30.         < id>d4099bb0-8186-5aa1-ce1f-672246c0fe9c< /id> 
  31.         < user> 
  32.             < profileUrl>http://friendfeed.com/asfaq< /profileUrl> 
  33.             < nickname>asfaq< /nickname> 
  34.             < id>41e24568-ee6b-11dc-a88d-003048343a40< /id> 
  35.             < name>Asfaq< /name> 
  36.         < /user> 
  37.     < /entry> 
  38.     < entry> 
  39.         < updated>2008-03-26T05:06:31Z< /updated> 
  40.         < service> 
  41.             < profileUrl>http://twitter.com/chrisjlee< /profileUrl> 
  42.             < id>twitter< /id> 
  43.             < name>Twitter< /name> 
  44.         < /service> 
  45.         < title>sleep..< /title> 
  46.         < link>http://twitter.com/chrisjlee/statuses/777188561< /link> 
  47.         < published>2008-03-26T05:06:31Z< /published> 
  48.         < id>8c4ec232-3ad5-28e1-16c0-00a428294c9c< /id> 
  49.         < user> 
  50.             < profileUrl>http://friendfeed.com/chrisjlee< /profileUrl> 
  51.             < nickname>chrisjlee< /nickname> 
  52.             < id>5af39ad4-53b6-45d8-ae25-ef7c50fe9568< /id> 
  53.             < name>Chris< /name> 
  54.         < /user> 
  55.     < /entry> 
  56.     < entry> 
  57.         < updated>2008-03-26T05:06:49Z< /updated> 
  58.         < service> 
  59.             < profileUrl> 
  60.                 http://www.google.com/reader/shared/09566745492004297397  
  61.             < /profileUrl> 
  62.             < id>googlereader< /id> 
  63.             < name>Google Reader< /name> 
  64.         < /service> 
  65.         < title>Poketo First Editions Show!!< /title> 
  66.         < link> 
  67.             http://www.poketo.com/blog/2008/03/24/poketo-first-editions-show/  
  68.         < /link> 
  69.         < published>2008-03-26T05:06:49Z< /published> 
  70.         < id>4caefceb-d71c-59c9-8199-45c5adbc60f2< /id> 
  71.         < user> 
  72.             < profileUrl>http://friendfeed.com/misterjt< /profileUrl> 
  73.             < nickname>misterjt< /nickname> 
  74.             < id>e745cc8a-f9e4-11dc-a477-003048343a40< /id> 
  75.             < name>Jason Toney< /name> 
  76.         < /user> 
  77.     < /entry> 
  78. < /feed> 

對(duì)于您的應(yīng)用程序,您將首先得到一個(gè)基于某種服務(wù)的用戶(hù)列表。因此,將首先過(guò)濾提要,從而只獲得感興趣的服務(wù)。查看 清單 4 了解 Scala 如何實(shí)現(xiàn)上述功能。

清單 4. 過(guò)濾基于服務(wù)的提要

 
 
 
  1. def filterFeed(feed:Elem, feedId:String):Seq[Node] = {  
  2.    var results = new Queue[Node]()  
  3.    feed\"entry" foreach{(entry) =>  
  4.      if (search(entry\"service"\"id" last, feedId)){  
  5.        results += (entry\"user"\"nickname").last  
  6.      }  
  7.    }  
  8.    return results  
  9.  }  
  10.    
  11.  def search(p:Node, Name:String):Boolean = p match {  
  12.    case < id>{Text(Name)}< /id> => true 
  13.    case _ => false 
  14.  } 

您的函數(shù) filterFeed 接受一個(gè) XML 元素(提要)和一個(gè)服務(wù) ID 作為參數(shù)。首先創(chuàng)建一個(gè)稱(chēng)為 results 的 XML 節(jié)點(diǎn)隊(duì)列。隊(duì)列被參數(shù)化,類(lèi)似 Java 中的 List 和 Map。 Scala 使用方括號(hào)來(lái)表示泛型類(lèi)型,而不是像 Java 編程使用的尖括號(hào)。feed\"entry" 行是一個(gè)類(lèi) XPath 表達(dá)式。反斜杠符號(hào)實(shí)際上是 scala.xml.Elem 類(lèi)的一個(gè)方法。它返回具有給定名稱(chēng)的所有子節(jié)點(diǎn),即提要中所有 < entry> 元素。這將作為一個(gè) scala.xml.NodeSeq 類(lèi)的實(shí)例返回。這個(gè)類(lèi)擴(kuò)展了 Seq[Node]。因?yàn)樗且粋€(gè) Seq,它具有一個(gè) foreach方法,并將一個(gè)閉包作為參數(shù)。

(entry) => ... 標(biāo)記表示一個(gè)將單個(gè)參數(shù)標(biāo)記為條目的閉包。在這個(gè)閉包中,您將再次使用類(lèi) XPath 表達(dá)式 entry\"service"\"id" 來(lái)從 entry 節(jié)點(diǎn)提取服務(wù)的 ID。把服務(wù) ID 傳遞給搜索函數(shù)來(lái)將其與傳遞給方法的提要 ID 相比較。我們稍后將查看這個(gè)函數(shù)體。如果匹配的話(huà),您可將創(chuàng)建條目的用戶(hù)別名添加到結(jié)果隊(duì)列中。注意這個(gè)隊(duì)列目標(biāo)中類(lèi)似操作符的符號(hào),+=。再次聲明這僅僅是一個(gè)隊(duì)列對(duì)象的函數(shù)。您可以使用 Scala 的類(lèi) XPath 語(yǔ)法來(lái)提取用戶(hù)別名節(jié)點(diǎn)。

現(xiàn)在參看搜索函數(shù),這個(gè)函數(shù)使用一個(gè)功能最強(qiáng)大的 Scala 特性:模式匹配。在這種情況下,將輸入節(jié)點(diǎn)與一個(gè)名為 id 的節(jié)點(diǎn)相比較,id 節(jié)點(diǎn)的子文本節(jié)點(diǎn)由傳遞給函數(shù)的 Name 字符串構(gòu)成。如果匹配則函數(shù)返回 true。語(yǔ)法 case _ 和所有內(nèi)容匹配。其中__再次用作 Scala 的通配符。諸如 case _ 這樣的聲明和 Java 或 C++ 代碼中 case 語(yǔ)句的默認(rèn)子句類(lèi)似。這個(gè)簡(jiǎn)單的例子證明了 Scala 中模式匹配的強(qiáng)大功能。下面您將會(huì)明白如何構(gòu)建 XML 結(jié)構(gòu)。

#p#

利用模式匹配構(gòu)建 XML

在應(yīng)用程序中,您需要為從 FriendFeed 公共提要提取出的所有用戶(hù)別名構(gòu)建一個(gè)新的 XML 結(jié)構(gòu)。實(shí)現(xiàn)上述操作有許多方法,但我們將演示如何再一次使用模式匹配方法。看一下 清單 5 中所示的函數(shù)。

清單 5. 利用模式匹配構(gòu)造函數(shù)

 
 
 
  1. def add(p:Node, newEntry:Node ):Node = p match {  
  2.    case < UserList>{ ch @ _* }< /UserList> =>   
  3.      < UserList>{ ch }{ newEntry }< /UserList>  

這個(gè)模式將會(huì)和一個(gè)具有任意類(lèi)型的子節(jié)點(diǎn)的 UserList 元素匹配。繼而返回一個(gè)具有相同子節(jié)點(diǎn)的新 UserList 元素,另外在現(xiàn)有子節(jié)點(diǎn)之后又增加了一個(gè)子節(jié)點(diǎn)。這在功能上等效于 DOM 規(guī)范中的 appendChild 用法。但它有本質(zhì)的不同,因?yàn)樵脊?jié)點(diǎn)沒(méi)有改變(它也不能改變,因?yàn)樗遣豢勺兊模?。相反?chuàng)建并返回了一個(gè)新節(jié)點(diǎn)。這樣比等效的 DOM 操作使用更多的內(nèi)存。我們來(lái)看一下使用 Scala 構(gòu)建 XML 結(jié)構(gòu)的其他方法。

創(chuàng)建 XML

當(dāng)創(chuàng)建新的 XML 文檔時(shí),Scala 的原生 XML 語(yǔ)法再合適不過(guò)。第一個(gè)例子是獲取創(chuàng)建的 UserList 結(jié)構(gòu)并把它封裝在相關(guān)服務(wù)的節(jié)點(diǎn)中。清單 6 顯示了這些代碼。

清單 6. 創(chuàng)建服務(wù)結(jié)果

 
 
 
  1. def results(name:String, cnt:Int, elements:NodeSeq):Any = {  
  2.    if (cnt > 0){  
  3.      return < Service id={name}>{elements}< /Service>  
  4.    }   
  5.  } 

由于 Scala 提供了對(duì) XML 的原生支持,您可以利用一個(gè)模板樣式的語(yǔ)法將動(dòng)態(tài)數(shù)據(jù)插入到 XML 結(jié)構(gòu)中。在本例中,使用傳入的名稱(chēng)字符串設(shè)置 id 屬性。您將獲得一串傳入的元素,將它們作為正在創(chuàng)建的 Service 元素的子節(jié)點(diǎn)。但是要注意,只有在 cnt 參數(shù)大于 0 的情況下才執(zhí)行上述操作。如果 cnt 值等于 0,這個(gè)函數(shù)將不返回任何值。在 Scala 中您可以通過(guò)聲明函數(shù)返回 Any 來(lái)解決這個(gè)問(wèn)題。Any 類(lèi)在 Scala 中是一個(gè)原始的類(lèi),類(lèi)似于 java.lang.Object。Scala 沒(méi)有 void 類(lèi)型,但是有一個(gè)等價(jià)的 Unit 類(lèi)型。它的優(yōu)點(diǎn)是可以擴(kuò)展 Any 類(lèi),并且允許函數(shù)在某些情況下返回對(duì)象,而在其他時(shí)候不返回任何內(nèi)容。

如您所見(jiàn),在 Scala 的 XML 語(yǔ)法中結(jié)合動(dòng)態(tài)數(shù)據(jù)可以產(chǎn)生強(qiáng)大的功能。再舉一個(gè)例子,您可以創(chuàng)建一個(gè)統(tǒng)計(jì) XML 文檔,其中顯示的 XML 描述每個(gè)服務(wù)在提要中出現(xiàn)的次數(shù)。代碼如 清單 7 所示。

清單 7. 創(chuàng)建統(tǒng)計(jì) XML

 
 
 
  1. def stats(map:HashMap[String,Int]):Node = {  
  2.    var nodes = new Queue[Node]()  
  3.    map.foreach{(nvPair) =>  
  4.      nodes += < Service id={nvPair._1} cnt={nvPair._2.toString}/>  
  5.    }  
  6.    return < Stats>{nodes}< /Stats>  

您的函數(shù)要求 HashMap 的鍵是服務(wù)的名稱(chēng),其值為服務(wù)在 FriendFeed 中出現(xiàn)的次數(shù)。這個(gè)函數(shù)使用熟悉的 foreach-closure 風(fēng)格遍歷 HashMap,然后使用 HashMap 的名稱(chēng)/值對(duì)創(chuàng)建一個(gè)新節(jié)點(diǎn),將這個(gè)節(jié)點(diǎn)添加到節(jié)點(diǎn)隊(duì)列中。隨后創(chuàng)建 Stats 結(jié)構(gòu)并作為動(dòng)態(tài)數(shù)據(jù)訪(fǎng)問(wèn)節(jié)點(diǎn)隊(duì)列,節(jié)點(diǎn)隊(duì)列隨后被賦值給一個(gè) XML 結(jié)構(gòu)?,F(xiàn)在準(zhǔn)備好了所有函數(shù),您只需驅(qū)動(dòng)程序以便進(jìn)行測(cè)試。

運(yùn)行和測(cè)試

在運(yùn)行程序之前,需要加入一些代碼來(lái)驅(qū)動(dòng)它。將創(chuàng)建一個(gè) main 方法,就像使用 Java 編程一樣,如 清單 8 所示。

清單 8. FriendFeed main 方法

 
 
 
  1. def main(args:Array[String]) = {  
  2.     val feedXml = friendFeed  
  3.     var map = new HashMap[String,Int]  
  4.     args.foreach{(serviceName) =>  
  5.       val filteredEntries = filterFeed(feedXml, serviceName)  
  6.       var users:Node = < UserList/>  
  7.       filteredEntries.foreach{(user) =>  
  8.         users = add(users, user)  
  9.       }  
  10.       map += serviceName -> filteredEntries.length  
  11.       println(results(serviceName,filteredEntries.length,users))  
  12.     }  
  13.     println(stats(map))  

這個(gè)方法創(chuàng)建了 FriendFeed。它接受命令行參數(shù)確定哪些服務(wù)查找用戶(hù)并計(jì)算統(tǒng)計(jì)數(shù)據(jù)。注意這些語(yǔ)法與 Java 語(yǔ)法非常相似。main 函數(shù)接受一個(gè) String 數(shù)組(稱(chēng)為 args)作為參數(shù)。這個(gè)程序?yàn)榻y(tǒng)計(jì)文檔創(chuàng)建 HashMap,并且為每個(gè)服務(wù)創(chuàng)建 UserList 文檔。然后輸出每個(gè) UserList 和統(tǒng)計(jì)文檔。要運(yùn)行這個(gè)程序,需要使用 scalac FriendFeed.scala 和 scala FriendFeed 進(jìn)行編譯,如 清單 9 所示。

清單 9. 運(yùn)行程序

 
 
 
  1. $ scalac FriendFeed.scala  
  2. $ scala FriendFeed googlereader flickr delicious twitter blog  
  3. < Service id="twitter">< UserList>< nickname>ntamaoki< /nickname> 
  4. < nickname>terrazi< /nickname>< nickname>ntamaoki< /nickname> 
  5. < nickname>terrazi< /nickname>< nickname>ntamaoki< /nickname> 
  6. < nickname>parodi< /nickname>< nickname>trevor< /nickname> 
  7. < nickname>cindy< /nickname>< nickname>christinelu< /nickname> 
  8. < nickname>clint< /nickname>< nickname>savvyauntie< /nickname> 
  9. < nickname>44gi< /nickname>< /UserList>< /Service> 
  10. < ServiceidServiceid="blog">< UserList>< nickname>nechipor< /nickname> 
  11. < nickname>mdolla< /nickname>< nickname>kyhpudding< /nickname> 
  12. < nickname>hanayuu< /nickname>< nickname>hanayuu< /nickname> 
  13. < /UserList>< /Service>< Stats>< Service cnt="12" id="twitter"> 
  14. < /Service>< Service cnt="0" id="delicious">< /Service>< Service   
  15. cnt="0" id="flickr">< /Service>< Service cnt="0" id="googlereader"> 
  16. < /Service>< Service cnt="5" id="blog">< /Service>< /Stats> 

您當(dāng)然可以選擇不同的服務(wù)名稱(chēng)作為命令行參數(shù)或其他參數(shù)。Scala 具備完美的 printer 類(lèi),可以使用正確的空格、制表符和格式打印 XML。還提供了 XML 寫(xiě)入程序(writer)將 XML 寫(xiě)回?cái)?shù)據(jù)流,比如文件。您可以使用 Scala 完成所有普通的任務(wù),同時(shí)還可以使用 Scala 提供的一些獨(dú)有的功能。

結(jié)束語(yǔ)

許多人把 Scala 視為 Java 編程語(yǔ)言發(fā)展歷程中的重要一步。XML 已經(jīng)成為一種重要的技術(shù),編程語(yǔ)言只有在其語(yǔ)法中內(nèi)置了 XML 支持,才能自然地應(yīng)用 XML 技術(shù)。而 Scala 做到了這一點(diǎn)。它使得復(fù)雜問(wèn)題變得簡(jiǎn)單。查看本文使用 Scala 執(zhí)行的所有功能,想像一下做同樣的事情需要使用多少行 Java 代碼。

【相關(guān)閱讀】

  1. Scala編程語(yǔ)言專(zhuān)題
  2. 從Java走進(jìn)Scala:構(gòu)建計(jì)算器 結(jié)合解析器組合子和case類(lèi)
  3. 從Java走進(jìn)Scala:構(gòu)建計(jì)算器 解析器組合子入門(mén)
  4. 從Java走進(jìn)Scala:簡(jiǎn)單的計(jì)算器 case類(lèi)和模式匹配
  5. 從Java走進(jìn)Scala:包和訪(fǎng)問(wèn)修飾符

網(wǎng)站欄目:使用Scala簡(jiǎn)化XML對(duì)象處理
當(dāng)前網(wǎng)址:http://www.dlmjj.cn/article/dpsiido.html