精品欧美一区二区三区在线观看 _久久久久国色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)

精品久久久久一区二区三区| 国产一级特黄aaa大片| 成人国产激情在线| 亚洲婷婷综合色高清在线| 99中文视频在线| av大片免费在线观看| 九色成人国产蝌蚪91| 欧美三区在线观看| 日本人妻伦在线中文字幕| 亚洲av片一区二区三区| 蜜桃一区二区三区四区| 久久91亚洲精品中文字幕奶水| 在线精品一区二区三区| 懂色aⅴ精品一区二区三区| 一区二区三区国产精品| 日本精品一区二区三区视频| 国产乱淫av免费| 国产欧美丝祙| 欧美成人sm免费视频| 偷拍女澡堂一区二区三区| 欧美成人毛片| 福利二区91精品bt7086| 久久久久久久久网| 国产小视频免费在线观看| 国产福利精品一区| 国产精品电影久久久久电影网| 久草视频在线免费看| 精品国产乱码久久久久久果冻传媒| 制服丝袜亚洲网站| 无遮挡又爽又刺激的视频| 欧美人与禽性xxxxx杂性| 国产三级精品三级| 国产精品久久久一区二区三区| 免费看av在线| 亚洲永久网站| 午夜欧美不卡精品aaaaa| 日韩成人毛片视频| 成人在线国产| 亚洲图片在区色| 国产真实乱人偷精品| 日韩一区二区三区在线看| 91国在线观看| 国产午夜伦鲁鲁| 国产盗摄一区二区| 亚洲六月丁香色婷婷综合久久 | 欧美人成在线观看ccc36| 欧美福利视频一区| 免费看污黄网站| 一区二区三区四区日本视频| 亚洲成人黄色影院| 丁香六月激情婷婷| 91视频欧美| 亚洲国产日韩精品| 久久国产精品网| bl视频在线免费观看| 亚洲综合清纯丝袜自拍| 久久免费一级片| 日本动漫同人动漫在线观看| 一区二区三区**美女毛片| 草草草视频在线观看| 超碰porn在线| 伊人婷婷欧美激情| 日韩一级性生活片| 国产夫妻在线| 一本色道久久综合亚洲精品按摩| 日本黄色三级大片| 向日葵视频成人app网址| 在线一区二区三区做爰视频网站| 爆乳熟妇一区二区三区霸乳| 日韩在线观看不卡| 欧美日韩五月天| 久久综合在线观看| 成人午夜网址| 亚洲欧美成人网| 大胸美女被爆操| 久久久五月天| 国产+成+人+亚洲欧洲| 日韩人妻精品中文字幕| 日韩成人免费看| 成人性生交大片免费看小说| 亚洲国产精品视频在线| av一二三不卡影片| 日韩在线国产| 国产一区久久精品| 性欧美大战久久久久久久久| 免费黄色福利视频| 视频欧美精品| 亚洲精品福利在线观看| 337人体粉嫩噜噜噜| 欧美另类综合| 国产精品国产三级国产aⅴ9色| 91亚洲欧美激情| 不卡的av网站| 亚洲精品一区二区三区蜜桃久| 黄色免费在线网站| 亚洲国产精品综合小说图片区| 青青草原av在线播放| 亚洲午夜剧场| 亚洲精品自在久久| 久久久国产精品人人片| 噜噜噜在线观看免费视频日韩| 成人激情免费在线| 青青草在线播放| 亚洲日本一区二区| wwwxxx黄色片| 超碰在线成人| 最近的2019中文字幕免费一页| 国产污视频在线看| 精品一区二区三区免费观看| 久久riav| 成人免费高清观看| 欧美日韩一级二级| 全黄一级裸体片| 欧美日本在线| 国产区精品视频| 免费一级在线观看播放网址| 一区二区成人在线视频| 欧美成人福利在线观看| 神马午夜久久| 久久男人的天堂| 99在线无码精品入口| 国产亚洲欧美日韩日本| 日本a视频在线观看| **日韩最新| 国产亚洲日本欧美韩国| 四虎成人永久免费视频| 国产91富婆露脸刺激对白| 亚洲综合首页| 日韩av首页| 亚洲欧美日韩区| 日韩成年人视频| 国产精品一二三在| 中文字幕中文字幕在线中一区高清 | 亚洲欧美色图小说| 国模私拍视频在线观看| 精品久久久中文字幕| 精品福利在线视频| 国产va免费精品高清在线观看| 在线观看毛片网站| 久久久久88色偷偷免费| 精品少妇在线视频| 91久久偷偷做嫩草影院电| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 免费精品视频在线| 国产超碰91| 在线中文字幕第一页| 欧美亚洲国产一区二区三区va | www国产成人| 99在线免费视频观看| 中文字幕一区日韩精品| 亚洲第一福利社区| 2020国产精品视频| 午夜在线视频免费| 婷婷成人综合网| 中文字幕在线播放视频| 亚洲美女网站| 美女亚洲精品| 国产超碰精品| 在线免费观看羞羞视频一区二区| 制服丝袜在线一区| 一区在线中文字幕| 九九九久久久久久久| 伊人久久大香线蕉综合四虎小说 | 久章草在线视频| 精品国产精品| 91久久久国产精品| 青青在线视频| 日韩精品视频免费在线观看| 日韩人妻精品中文字幕| 国产精品私人影院| 天堂网成人在线| 黄色av日韩| 欧美成人一区二区在线| 偷拍自拍在线看| 中文字幕亚洲综合久久| 99国产精品欲| 午夜影院久久久| 亚洲av无码一区二区三区人 | 欧美精品久久久久久久久老牛影院| 五月天免费网站| 国产精品66部| 99爱视频在线| 久久麻豆精品| 成人9ⅰ免费影视网站| 亚洲涩涩在线| 久久精品99久久香蕉国产色戒| 亚洲第一色视频| 91福利国产精品| 日韩在线中文字幕视频| 99re这里只有精品视频首页| 爱情岛论坛亚洲首页入口章节| 久久久精品久久久久久96| 国产精品免费看一区二区三区| 国产精品一区二区av影院萌芽| 日韩在线激情视频| 全国男人的天堂网| 在线观看欧美精品| 久久久久久久久久99| 久久精品视频免费| 丰满少妇一区二区三区专区| 国产日韩欧美在线播放不卡| 中文字幕日韩精品一区二区| 天堂成人娱乐在线视频免费播放网站| 成人av资源在线播放| 都市激情国产精品| 久久久久999| 韩国三级av在线免费观看| 日韩欧美一区在线| 国产乱码在线观看| 亚洲成人精品影院| 神马久久精品综合| 久久久久久久久久电影| 在线观看欧美一区二区| 奇米影视一区二区三区小说| 97干在线视频| 欧美高清一区| 亚洲人成人77777线观看| 精品亚洲自拍| 91香蕉视频在线下载| 国产精品亚洲一区二区三区在线观看 | 午夜成年人在线免费视频| 亚洲男人天堂久| 免费观看成年人视频| 欧美理论片在线| 特级西西444www大胆免费看| 欧美视频一二三| 亚洲欧美在线观看视频| 一区二区三区不卡视频| 免费看特级毛片| 国产精品久久777777| 国产精品免费无码| 久久人人97超碰com| 欧美日韩人妻精品一区在线| 国产寡妇亲子伦一区二区| 色天使在线观看| 理论片日本一区| 91香蕉视频导航| 秋霞午夜av一区二区三区| 国产精品第12页| 免费日韩av片| 97国产精东麻豆人妻电影| 亚洲精品影院在线观看| 国产精彩视频一区二区| 极品尤物久久久av免费看| 国产在线视频在线| 欧美午夜影院| 国产毛片久久久久久国产毛片| 欧美在线网站| 国产免费裸体视频| 韩日在线一区| 69sex久久精品国产麻豆| 精品福利av| 国产在线播放观看| 亚洲资源av| 久久久久久久久久久福利| 噜噜噜在线观看免费视频日韩| 欧美黄网站在线观看| 久久精品五月| 日韩大片一区二区| 久久草av在线| 精品人妻人人做人人爽夜夜爽| 国产成人精品1024| 国产a级黄色片| 久久免费看少妇高潮| av网站免费在线看| 中文字幕一区二区三区四区不卡 | av电影在线免费| 7m第一福利500精品视频| 日本免费一区二区三区四区| 国产精品久久电影观看| 99久久999| 国产精品v欧美精品∨日韩| 亚洲女娇小黑人粗硬| 亚洲欧美精品在线观看| 综合激情视频| 狠狠干 狠狠操| 日本亚洲欧美天堂免费| 中文 日韩 欧美| 99麻豆久久久国产精品免费| 国产全是老熟女太爽了| 1024亚洲合集| 国产成人愉拍精品久久| 日本大香伊一区二区三区| 一卡二卡三卡在线观看| 亚洲第一精品电影| 啊v视频在线| 欧美激情免费在线| 日韩影片中文字幕| 51国偷自产一区二区三区的来源| 麻豆精品少妇| 午夜啪啪免费视频| 亚洲三级影院| www.51色.com| www国产成人免费观看视频 深夜成人网| 国产欧美小视频| 亚洲国产aⅴ天堂久久| 中文字幕人妻丝袜乱一区三区| 日韩视频免费观看高清完整版 | 久久久免费高清电视剧观看| 色天使综合视频| 国产精品国产三级国产专区53| 精品国产一区探花在线观看| 亚洲精品天堂成人片av在线播放| 日韩影院在线观看| 丰满岳乱妇一区二区| 日韩一区在线免费观看| 国产成人无码av| 欧美精品一区二区三区久久久| 91啦中文在线| 欧洲永久精品大片ww免费漫画| 日韩一二三区在线观看| 午夜欧美性电影| 午夜在线视频观看日韩17c| 久久久久亚洲av片无码v| 日本一区二区三区高清不卡| 日韩免费av片| 日韩精品一区二区三区视频| √天堂资源地址在线官网| 日韩美女在线观看| 国产精品自在| 特级西西人体www高清大胆| 免费高清成人在线| caopeng视频| 欧美日韩亚洲一区二区| 亚洲av无码片一区二区三区| 日韩视频在线免费| 国产激情欧美| 四虎一区二区| 日本一不卡视频| 免费看黄色三级| 91国产丝袜在线播放| 深夜福利免费在线观看| 91国内在线视频| 黑色丝袜福利片av久久| 91午夜在线观看| 国产不卡视频一区| 国产盗摄x88av| 91精品国产91久久久久久一区二区| 91社区在线| 国产噜噜噜噜久久久久久久久| 精品日本12videosex| 欧美牲交a欧美牲交aⅴ免费下载| 菠萝蜜视频在线观看一区| 久久久久亚洲av片无码下载蜜桃| 日韩一二在线观看| 在线观看免费视频你懂的| 亚洲综合小说区| 欧美一区二区三区免费看| 亚洲三级在线视频| 一区二区三区四区不卡在线 | 国产aa精品| 69精品丰满人妻无码视频a片| 国产黄色91视频| 日韩精品一区三区| 日韩精品高清在线| 韩国主播福利视频一区二区三区| 欧美一区二区三区精美影视| 日韩高清不卡一区二区| 中文字幕求饶的少妇| 欧美精品tushy高清| 午夜成年人在线免费视频| 国产精品久久亚洲| 久久久久国产一区二区| 亚洲自拍偷拍图| 制服丝袜在线91| 国产在线xxx| 欧美日本亚洲| 麻豆专区一区二区三区四区五区| 可以免费看av的网址| 欧美一级夜夜爽| 国产美女高潮在线| 水蜜桃亚洲精品| 国产成人午夜精品影院观看视频 | 日韩精品在线影院| 欧美日韩国产网站| 国产精品久久成人免费观看| 成人小视频免费在线观看| 性无码专区无码| 久久精品99久久久久久久久| jizz性欧美23| 超碰在线公开97| 亚洲国产精品麻豆| 国产小视频在线观看| 亚洲已满18点击进入在线看片 | 亚洲一区二区五区| 天堂在线中文资源| 日本视频久久久| 亚洲综合专区| 人妻丰满熟妇aⅴ无码| 欧美日韩1区2区| 五月天av在线| 欧美一级爱爱视频| 国产日韩av一区二区| 亚洲精品国产精品国| 国产精品久久9| 一区二区福利| 欧美成人黄色网| 国产一区二区精品丝袜| 91成人午夜| 日韩中文字幕a|