精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用Scala簡(jiǎn)化XML對(duì)象處理

開發(fā) 后端
Scala的語法使其在某些場(chǎng)景下成為 Java 的一個(gè)強(qiáng)有力的候補(bǔ)。這些場(chǎng)景之一就是 XML 處理。Scala 容許您以多種方式導(dǎo)航和處理解析后的 XML對(duì)象。它還為 XML 構(gòu)建提供了一流支持,因此無需創(chuàng)建 XML 字符串或以編程方式構(gòu)建 DOM 樹。

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

解析 XML

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

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

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

利用 Java 庫

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

清單 1. 訪問 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 類。 Scala 不必使用自己的 API 執(zhí)行諸如打開 HTTP 連接之類的操作,因?yàn)樗梢岳?Java 的 API 來解決這個(gè)問題。注意 Scala 為從同一包導(dǎo)入多個(gè)類提供了捷徑。下一行導(dǎo)入 Scala 的核心 XML 類。下劃線就像 Java 中的星號(hào)一樣,它導(dǎo)入 scala.xml 包中的所有類。

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

清單 2. 訪問 friendFeed 方法 

  1. val feedXml = friendFeed 

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

#p#

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

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

了解了這些內(nè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ù)的用戶列表。因此,將首先過濾提要,從而只獲得感興趣的服務(wù)。查看 清單 4 了解 Scala 如何實(shí)現(xiàn)上述功能。

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

(entry) => ... 標(biāo)記表示一個(gè)將單個(gè)參數(shù)標(biāo)記為條目的閉包。在這個(gè)閉包中,您將再次使用類 XPath 表達(dá)式 entry\"service"\"id" 來從 entry 節(jié)點(diǎn)提取服務(wù)的 ID。把服務(wù) ID 傳遞給搜索函數(shù)來將其與傳遞給方法的提要 ID 相比較。我們稍后將查看這個(gè)函數(shù)體。如果匹配的話,您可將創(chuàng)建條目的用戶別名添加到結(jié)果隊(duì)列中。注意這個(gè)隊(duì)列目標(biāo)中類似操作符的符號(hào),+=。再次聲明這僅僅是一個(gè)隊(duì)列對(duì)象的函數(shù)。您可以使用 Scala 的類 XPath 語法來提取用戶別名節(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。語法 case _ 和所有內(nèi)容匹配。其中__再次用作 Scala 的通配符。諸如 case _ 這樣的聲明和 Java 或 C++ 代碼中 case 語句的默認(rèn)子句類似。這個(gè)簡(jiǎn)單的例子證明了 Scala 中模式匹配的強(qiáng)大功能。下面您將會(huì)明白如何構(gòu)建 XML 結(jié)構(gòu)。

#p#

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

在應(yīng)用程序中,您需要為從 FriendFeed 公共提要提取出的所有用戶別名構(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è)具有任意類型的子節(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)沒有改變(它也不能改變,因?yàn)樗遣豢勺兊模O喾磩?chuàng)建并返回了一個(gè)新節(jié)點(diǎn)。這樣比等效的 DOM 操作使用更多的內(nèi)存。我們來看一下使用 Scala 構(gòu)建 XML 結(jié)構(gòu)的其他方法。

創(chuàng)建 XML

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

如您所見,在 Scala 的 XML 語法中結(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ù)的名稱,其值為服務(wù)在 FriendFeed 中出現(xiàn)的次數(shù)。這個(gè)函數(shù)使用熟悉的 foreach-closure 風(fēng)格遍歷 HashMap,然后使用 HashMap 的名稱/值對(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ù)訪問節(jié)點(diǎn)隊(duì)列,節(jié)點(diǎn)隊(duì)列隨后被賦值給一個(gè) XML 結(jié)構(gòu)。現(xiàn)在準(zhǔn)備好了所有函數(shù),您只需驅(qū)動(dòng)程序以便進(jìn)行測(cè)試。

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

在運(yùn)行程序之前,需要加入一些代碼來驅(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ù)查找用戶并計(jì)算統(tǒng)計(jì)數(shù)據(jù)。注意這些語法與 Java 語法非常相似。main 函數(shù)接受一個(gè) String 數(shù)組(稱為 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ù)名稱作為命令行參數(shù)或其他參數(shù)。Scala 具備完美的 printer 類,可以使用正確的空格、制表符和格式打印 XML。還提供了 XML 寫入程序(writer)將 XML 寫回?cái)?shù)據(jù)流,比如文件。您可以使用 Scala 完成所有普通的任務(wù),同時(shí)還可以使用 Scala 提供的一些獨(dú)有的功能。

結(jié)束語

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

【相關(guān)閱讀】

  1. Scala編程語言專題
  2. 從Java走進(jìn)Scala:構(gòu)建計(jì)算器 結(jié)合解析器組合子和case類
  3. 從Java走進(jìn)Scala:構(gòu)建計(jì)算器 解析器組合子入門
  4. 從Java走進(jìn)Scala:簡(jiǎn)單的計(jì)算器 case類和模式匹配
  5. 從Java走進(jìn)Scala:包和訪問修飾符
責(zé)任編輯:yangsai 來源: IBMDW
相關(guān)推薦

2009-02-05 17:28:01

ScalaFriendFeedXML

2009-07-22 07:47:00

Scala客戶代碼

2010-01-08 13:25:07

ibmdwXML

2009-02-26 13:35:10

XMLSAXParserJDOM

2009-06-10 21:51:42

JavaScript XMLFirefox

2009-09-09 11:14:16

Scala對(duì)象

2010-03-11 10:34:22

Scala

2011-06-28 11:06:16

Scala

2009-07-21 12:18:37

ScalaRational對(duì)象toString

2009-07-21 08:21:46

Scala對(duì)象相等性

2010-11-17 11:31:22

Scala基礎(chǔ)面向?qū)ο?/a>Scala

2009-09-24 09:38:00

Scala講座第一類對(duì)象scala

2009-07-21 14:30:38

Scalatry-catch

2009-02-24 10:09:02

XMLJava對(duì)象

2011-01-24 13:20:49

2022-06-09 10:42:47

GoJSON

2009-07-22 09:22:20

Scala工廠對(duì)象

2009-02-04 17:32:03

ibmdwJavaScala

2017-04-05 15:45:20

2021-03-10 09:20:31

await代碼前端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

精品综合久久久久久8888| 成人a'v在线播放| 欧美日韩国产中文精品字幕自在自线 | 欧美亚洲爱爱另类综合| 国产字幕在线观看| 亚洲在线久久| 日韩精品久久久久久福利| 波多结衣在线观看| 黄色网页网址在线免费| 不卡一区二区在线| 国产日韩欧美另类| 日韩少妇裸体做爰视频| 日韩三级在线| 亚洲精品理论电影| 日韩av自拍偷拍| 亚洲一二三四| 亚洲电影一级黄| 亚洲一区二区免费视频软件合集| 日韩中文字幕观看| 国产在线不卡一区| 国产精品美女久久久久久免费| 久草免费新视频| 99九九热只有国产精品| 日韩电影网在线| 韩国三级丰满少妇高潮| 成人涩涩视频| 精品欧美激情精品一区| 欧美交换配乱吟粗大25p| 欧洲免费在线视频| 成人午夜视频网站| 亚洲va欧美va国产综合剧情| 波多野结衣在线电影| 在线精品福利| 欧美激情a∨在线视频播放| www成人啪啪18软件| 免费精品国产| 亚洲成av人片在线观看香蕉| 肉色超薄丝袜脚交| 久久精品国产精品亚洲毛片| 色菇凉天天综合网| 国产伦精品一区二区三区四区视频_ | 性欧美video高清bbw| 91丝袜美腿高跟国产极品老师| 3d精品h动漫啪啪一区二区 | 麻豆久久一区二区| 国产99视频精品免视看7| 香蕉免费毛片视频| 亚洲黄色天堂| 91国内免费在线视频| 国产在线观看免费视频今夜| 中文字幕一区二区精品区| 久久精品成人欧美大片古装| 亚洲区一区二区三| 99久久激情| 久久久精品久久久久| 手机av在线不卡| 日韩成人精品一区| 最新中文字幕亚洲| 日本激情视频一区二区三区| 日韩综合网站| 久久亚洲国产精品| 青青草原在线免费观看| 欧美天堂亚洲电影院在线观看| 欧美成人免费一级人片100| 久久黄色免费视频| 亚洲区第一页| 国产99久久精品一区二区| 国产成人无码专区| 另类小说一区二区三区| 成人激情视频网| av片免费播放| 99视频热这里只有精品免费| 免费一区二区三区| jizz日韩| 一区二区三区蜜桃| 鲁一鲁一鲁一鲁一色| 搜成人激情视频| 7777精品伊人久久久大香线蕉的| 人妻换人妻仑乱| 牛牛影视久久网| 一区二区国产精品视频| 国产传媒免费在线观看| 国产精品草草| 国产ts人妖一区二区三区| 中文字幕av片| 国产成人av网站| 欧美国产一区二区在线| 激情在线小视频| 精品美女久久久久久免费| 成人黄色一区二区| 久久视频社区| 亚洲精品自在久久| 亚洲天堂网av在线| 亚洲在线黄色| 亚洲a中文字幕| 日韩在线免费看| 亚洲老妇xxxxxx| 久久美女福利视频| 国产成年精品| 亚洲片在线资源| 久久久久无码国产精品不卡| 亚洲影视综合| 91久久偷偷做嫩草影院| 精品999视频| 亚洲午夜在线观看视频在线| 国产视频一区二区视频| swag国产精品一区二区| 国产一区二区久久精品| 日干夜干天天干| 国产伦精品一区二区三区在线观看| 国产乱码精品一区二区三区卡| 成人欧美亚洲| 欧美日韩亚洲91| 天天久久综合网| 精品99在线| 97成人在线视频| 精品久久久久成人码免费动漫| 国产亚洲美州欧州综合国| h无码动漫在线观看| 日本欧美韩国| 精品亚洲永久免费精品| 美女视频黄免费| 激情五月婷婷综合| 日韩在线电影一区| 亚洲欧洲自拍| 亚洲激情在线观看| 欧美精品一区二区成人| 久久www免费人成看片高清| 免费日韩av电影| 九色porny丨入口在线| 欧美电影免费观看完整版| 国产精品成人在线视频| 久久性色av| 久久久久久欧美精品色一二三四| 欧美xxxx免费虐| 欧美成人性福生活免费看| 手机在线中文字幕| 美国欧美日韩国产在线播放| 日本三级中国三级99人妇网站| 九色porny丨入口在线| 亚洲成人黄色在线观看| 免看一级a毛片一片成人不卡| 激情综合五月天| 在线免费一区| 九色精品蝌蚪| 欧美www在线| 国产情侣激情自拍| 亚洲视频网在线直播| 在线观看免费污视频| 成人羞羞网站入口| 国产精品入口福利| 免费观看在线午夜影视| 欧美精品久久一区二区三区| 2014亚洲天堂| 国产精品一级黄| 妞干网在线播放| 97久久综合精品久久久综合| 欧美激情免费视频| 黄频网站在线观看| 大桥未久av一区二区三区| 国产传媒第一页| 久久午夜精品| 伊人情人网综合| 欧一区二区三区| 国内免费久久久久久久久久久| 可以免费看毛片的网站| 欧美日韩国产中字| 成人做爰69片免网站| 久久99精品久久久久久久久久久久 | 中文字幕免费观看视频| 国产亚洲精品福利| 手机av在线免费| 极品裸体白嫩激情啪啪国产精品| 国产精品久久亚洲7777| 中文字幕在线免费观看视频| 亚洲色图欧美制服丝袜另类第一页| 中文字幕 自拍偷拍| 一区二区在线观看视频| 欧美xxxxx少妇| 久久九九免费| 免费看啪啪网站| 丁香婷婷成人| 国产精品欧美激情| 在线看三级电影| 亚洲欧美国产视频| 国产露脸无套对白在线播放| 香蕉成人啪国产精品视频综合网 | 日韩美女在线观看一区| 免费黄网在线观看| 亚洲国产精品大全| 伊人精品在线视频| 亚洲成a人v欧美综合天堂 | 性感美女一级片| 欧美日韩一二区| 国产精品成人久久| 欧美国产欧美综合| 亚洲高清无码久久| 久久99蜜桃精品| 男人和女人啪啪网站| 婷婷亚洲五月色综合| 欧美aaaaa喷水| 久久视频社区| 国产精品手机播放| 大菠萝精品导航| 久久精品最新地址| 精品电影在线| 日韩成人免费视频| 国产丰满果冻videossex| 在线免费精品视频| 日本一区二区欧美| 亚洲天堂精品在线观看| 黄色aaa视频| av中文字幕亚洲| 精品国产乱码久久久久久1区二区 91网址在线观看精品 | 日本视频免费一区| 成年人午夜免费视频| 91精品动漫在线观看| 日韩av电影免费在线| 国产精品xxx在线观看| 欧美整片在线观看| 国产探花视频在线观看| 久久精品国产亚洲| jizz在线免费观看| 亚洲欧美精品在线| 人妻偷人精品一区二区三区| 7777精品伊人久久久大香线蕉 | 欧美三级日本三级| 国产精品第五页| 色综合99久久久无码国产精品| 97se亚洲国产综合自在线| aaaaa黄色片| 国产美女一区二区| 日韩欧美理论片| 久久99精品国产| 永久免费的av网站| 免费成人美女在线观看| 亚洲一级免费观看| 日韩不卡手机在线v区| 国产精品欧美激情在线观看| 在线亚洲欧美| 午夜免费福利小电影| 欧美精品导航| www成人免费| 国产精品久久| 精品视频在线观看一区| 亚洲高清久久| 妞干网在线观看视频| 欧美三级黄美女| 国产一区二区片| 伊人影院久久| 99999精品视频| 久久国产高清| 国产小视频精品| 久久精品国产久精国产| 蜜桃福利午夜精品一区| 国产精品一区二区三区网站| wwwxxx色| 99视频热这里只有精品免费| 国产制服丝袜在线| 国产婷婷一区二区| 一级黄色毛毛片| 综合精品久久久| 久久中文字幕无码| 狠狠色噜噜狠狠狠狠97| 69xxxx国产| 欧美日韩在线免费视频| 一级做a爱片性色毛片| 欧美一级免费大片| 色婷婷综合视频| 国产亚洲欧美另类中文| 黄色成人在线| 国产+成+人+亚洲欧洲| 中文字幕资源网在线观看免费 | 艳女tv在线观看国产一区| 国产午夜精品视频一区二区三区| 最新亚洲视频| 九九视频精品在线观看| 国产自产2019最新不卡| 在线免费看黄色片| 国产区在线观看成人精品 | 波多野结衣一区二区三区在线观看| 国产香蕉精品| 天天综合色天天综合色hd| 欧美一区视频| 成人黄色片视频| 国产一区二区三区高清播放| 欧美 变态 另类 人妖| 国产精品水嫩水嫩| 日韩欧美三级视频| 欧美日韩国产首页| 人妻与黑人一区二区三区| 国产一区二区三区在线播放免费观看| 超鹏97在线| 欧美专区在线视频| 亚洲国产一区二区三区网站| 欧美极品日韩| 亚洲网站视频| www.cao超碰| 久久久噜噜噜久久人人看 | 欧美高清性hdvideosex| 婷婷丁香花五月天| 久久精品国产一区二区电影| 忘忧草在线影院两性视频| 亚洲一区二区三区香蕉| 国产传媒欧美日韩成人精品大片| 日本一区二区三区四区五区六区| 久久精品人人| 91人人澡人人爽| 国产精品美女www爽爽爽| 依依成人综合网| 精品裸体舞一区二区三区| 91青青在线视频| 91超碰中文字幕久久精品| 免费欧美网站| 亚洲精品一品区二品区三品区| 国产日韩欧美一区在线| 日本wwwxx| 自拍偷拍亚洲综合| 国产99久久久久久免费看| 亚洲国产高清自拍| 五月花成人网| 91久久精品国产91久久性色| 成人嫩草影院| 蜜臀视频一区二区三区| 91亚洲精品久久久蜜桃网站| 黄色一级视频免费观看| 在线成人av影院| 欧洲日本在线| 91精品美女在线| 日韩中文首页| 亚洲欧美自偷自拍另类| 国产片一区二区| 波多野结衣视频观看| 国产视频久久久| 在线观看特色大片免费视频| 精品日本一区二区三区| 1000部精品久久久久久久久| 久久性爱视频网站| 亚洲国产综合视频在线观看| 精品国产无码AV| 欧美日韩福利在线观看| 欧美日韩黄网站| 亚洲中文字幕无码一区二区三区| 国产老肥熟一区二区三区| 国产精品老熟女一区二区| 日韩一区二区视频在线观看| 日本片在线看| 国产精品三区www17con| 亚洲欧洲一级| 懂色av粉嫩av蜜乳av| 色婷婷综合中文久久一本| 欧美色视频免费| 国产经典一区二区| 国产videos久久| 美女一区二区三区视频| 国产精品区一区二区三区| 夜夜爽8888| 欧美精品亚州精品| 超碰精品在线观看| 99精品在线免费视频| 久久亚洲二区三区| 亚洲一区二区色| 久久国产视频网站| 国产精品45p| 日韩精品免费播放| 国产精品国产三级国产aⅴ中文 | 亚洲综合精品在线| 久久精品国产综合| 视频在线观看免费影院欧美meiju 视频一区中文字幕精品 | 久久精品一本久久99精品| 韩国三级成人在线| av日韩一区二区三区| 久久久久高清精品| 国产精品一品二区三区的使用体验| xvideos亚洲| 超碰成人在线观看| 国产小视频精品| 亚洲影视在线播放| 青青国产在线| 成人在线小视频| 99精品国产在热久久下载| 免费一级黄色录像| 日韩欧美精品在线视频| 午夜影院一区| 在线视频不卡国产| 久久伊人蜜桃av一区二区| 亚洲一区二区三区高清视频| 国内免费精品永久在线视频| 成人一二三区| 成人在线视频免费播放| 欧美日韩国产综合草草| 第一av在线| 神马影院一区二区| 成人黄页在线观看| 岳乳丰满一区二区三区| 亚洲91av视频| 91精品91| 强伦人妻一区二区三区| 欧美一区二区成人| jizz欧美|