国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

使用Scala簡化XML對象處理

開發 后端
Scala的語法使其在某些場景下成為 Java 的一個強有力的候補。這些場景之一就是 XML 處理。Scala 容許您以多種方式導航和處理解析后的 XML對象。它還為 XML 構建提供了一流支持,因此無需創建 XML 字符串或以編程方式構建 DOM 樹。

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

解析 XML

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

樣例應用程序:FriendFeed

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

利用 Java 庫

您要做的首要事情是訪問 FriendFeed 的公共提要。其 URL 為 http://friendfeed.com/api/feed/public。默認的情況下它以 JSON 格式顯示數據并且顯示最新的 30 個條目。要將其改為 XML 格式,添加查詢字符串參數 format=xml。例如,要將條目數目改為 100,添加查詢字符串參數 num=100 。現在您只需要訪問這個 URL。這在 Java 代碼中很容易實現,因此在 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. }  

注意,這里要做的第一件事就是導入兩個核心的 Java 類。 Scala 不必使用自己的 API 執行諸如打開 HTTP 連接之類的操作,因為它可以利用 Java 的 API 來解決這個問題。注意 Scala 為從同一包導入多個類提供了捷徑。下一行導入 Scala 的核心 XML 類。下劃線就像 Java 中的星號一樣,它導入 scala.xml 包中的所有類。

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

清單 2. 訪問 friendFeed 方法 

  1. val feedXml = friendFeed 

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

#p#

導航和模式匹配

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

了解了這些內容,我們來看一下 FriendFeed 中的 XML 是什么樣子。清單 3 提供了一個例子。

清單 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> 

對于您的應用程序,您將首先得到一個基于某種服務的用戶列表。因此,將首先過濾提要,從而只獲得感興趣的服務。查看 清單 4 了解 Scala 如何實現上述功能。

清單 4. 過濾基于服務的提要

  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.  } 

您的函數 filterFeed 接受一個 XML 元素(提要)和一個服務 ID 作為參數。首先創建一個稱為 results 的 XML 節點隊列。隊列被參數化,類似 Java 中的 List 和 Map。 Scala 使用方括號來表示泛型類型,而不是像 Java 編程使用的尖括號。feed\"entry" 行是一個類 XPath 表達式。反斜杠符號實際上是 scala.xml.Elem 類的一個方法。它返回具有給定名稱的所有子節點,即提要中所有 < entry> 元素。這將作為一個 scala.xml.NodeSeq 類的實例返回。這個類擴展了 Seq[Node]。因為它是一個 Seq,它具有一個 foreach方法,并將一個閉包作為參數。

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

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

#p#

利用模式匹配構建 XML

在應用程序中,您需要為從 FriendFeed 公共提要提取出的所有用戶別名構建一個新的 XML 結構。實現上述操作有許多方法,但我們將演示如何再一次使用模式匹配方法。看一下 清單 5 中所示的函數。

清單 5. 利用模式匹配構造函數

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

這個模式將會和一個具有任意類型的子節點的 UserList 元素匹配。繼而返回一個具有相同子節點的新 UserList 元素,另外在現有子節點之后又增加了一個子節點。這在功能上等效于 DOM 規范中的 appendChild 用法。但它有本質的不同,因為原始節點沒有改變(它也不能改變,因為它是不可變的)。相反創建并返回了一個新節點。這樣比等效的 DOM 操作使用更多的內存。我們來看一下使用 Scala 構建 XML 結構的其他方法。

創建 XML

當創建新的 XML 文檔時,Scala 的原生 XML 語法再合適不過。第一個例子是獲取創建的 UserList 結構并把它封裝在相關服務的節點中。清單 6 顯示了這些代碼。

清單 6. 創建服務結果

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

由于 Scala 提供了對 XML 的原生支持,您可以利用一個模板樣式的語法將動態數據插入到 XML 結構中。在本例中,使用傳入的名稱字符串設置 id 屬性。您將獲得一串傳入的元素,將它們作為正在創建的 Service 元素的子節點。但是要注意,只有在 cnt 參數大于 0 的情況下才執行上述操作。如果 cnt 值等于 0,這個函數將不返回任何值。在 Scala 中您可以通過聲明函數返回 Any 來解決這個問題。Any 類在 Scala 中是一個原始的類,類似于 java.lang.Object。Scala 沒有 void 類型,但是有一個等價的 Unit 類型。它的優點是可以擴展 Any 類,并且允許函數在某些情況下返回對象,而在其他時候不返回任何內容。

如您所見,在 Scala 的 XML 語法中結合動態數據可以產生強大的功能。再舉一個例子,您可以創建一個統計 XML 文檔,其中顯示的 XML 描述每個服務在提要中出現的次數。代碼如 清單 7 所示。

清單 7. 創建統計 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>  

您的函數要求 HashMap 的鍵是服務的名稱,其值為服務在 FriendFeed 中出現的次數。這個函數使用熟悉的 foreach-closure 風格遍歷 HashMap,然后使用 HashMap 的名稱/值對創建一個新節點,將這個節點添加到節點隊列中。隨后創建 Stats 結構并作為動態數據訪問節點隊列,節點隊列隨后被賦值給一個 XML 結構。現在準備好了所有函數,您只需驅動程序以便進行測試。

運行和測試

在運行程序之前,需要加入一些代碼來驅動它。將創建一個 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))  

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

清單 9. 運行程序

  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> 

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

結束語

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

【相關閱讀】

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

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對象

2009-09-24 09:38:00

Scala講座第一類對象scala

2009-07-21 12:18:37

ScalaRational對象toString

2010-11-17 11:31:22

Scala基礎面向對象Scala

2009-07-21 08:21:46

Scala對象相等性

2010-03-11 10:34:22

Scala

2011-06-28 11:06:16

Scala

2009-07-21 14:30:38

Scalatry-catch

2009-02-24 10:09:02

XMLJava對象

2011-01-24 13:20:49

2009-07-22 09:22:20

Scala工廠對象

2022-06-09 10:42:47

GoJSON

2009-02-04 17:32:03

ibmdwJavaScala

2009-08-18 16:30:41

C# 操作XML

2021-03-10 09:20:31

await代碼前端
點贊
收藏

51CTO技術棧公眾號

色偷偷av亚洲男人的天堂| 欧美13videosex性极品| 99热自拍偷拍| 久久久久美女| 日韩中文在线中文网在线观看| 女人天堂在线| 成人国产亚洲欧美成人综合网| 国产精品激情自拍| 久久久久久久性潮| 爱福利在线视频| 97久久人人超碰| 51精品秘密在线观看| 久久久日本电影| 中文在线播放一区二区| 亚洲片av在线| 97视频在线观看网站| 国产亚洲精品中文字幕| 亚洲欧洲日韩综合二区| 日韩久久视频| 国模精品系列视频| 成人全视频在线观看在线播放高清| 777a∨成人精品桃花网| 亚洲视频精品在线观看| 亚洲欧美视频在线观看视频| 亚洲熟妇av日韩熟妇在线| 蜜臀久久99精品久久久久久9| 91在线无精精品一区二区| 成人福利免费在线观看| 日韩在线视频播放| 日本肉肉一区| 尤物精品国产第一福利三区| 国产乱码午夜在线视频| 精品99999| 亚洲丝袜精品| 日韩欧美国产一区二区三区| 福利片在线观看| 欧美亚洲动漫另类| 免费在线黄色影片| 欧美午夜免费电影| 91激情在线| 日韩色视频在线观看| 中文字幕中文字幕在线中高清免费版 | jizzzz日本| 欧美激情一区二区在线| 美女喷白浆视频| 日韩美女精品在线| 国产精品粉嫩av| 亚洲综合av网| 中文字幕av在线| 色狠狠桃花综合| 黄a在线观看| 日韩av一区二区在线观看| 亚洲欧美电影| 久久天天躁狠狠躁夜夜av| 国产精品视频首页| 欧美一性一乱一交一视频| 成人网18免费网站| 国产亚洲自拍偷拍| 麻豆精品视频在线观看免费| 日韩成人三级视频| 国产精品美女www爽爽爽| 嫩草嫩草嫩草嫩草| 色偷偷久久人人79超碰人人澡| 看黄网站在线| 亚洲人成在线观看| 免费萌白酱国产一区二区三区| 国产精品99久久99久久久二8| 亚洲激情久久| 亚洲一区在线直播| 欧美极品xxx| 欧洲天堂在线观看| 日韩av一区在线| 另类春色校园亚洲| av在线不卡一区| 国内精品视频一区二区三区八戒| 国产精品免费入口| 精品国产91久久久久久老师| 在线观看男女av免费网址| 国产视频九色蝌蚪| 一区二区三区在线观看国产| 国产在线观看网站| 亚洲欧美日韩天堂一区二区| 国产精品乱战久久久| 国产伦精品一区二区三区免| 国产成a人无v码亚洲福利| 欧美xxxxxxxxx59| 日韩欧美国产电影| 成午夜精品一区二区三区软件| 99视频在线播放| 99久久精品免费观看| 在线成人动漫| 一本色道久久88综合日韩精品 | 白浆在线视频| 欧美放荡办公室videos4k| 欧美日韩免费观看一区=区三区| 91成人在线视频观看| 亚洲精品免费一二三区| 色帝国亚洲欧美在线| 欧美在线亚洲在线| 天堂成人国产精品一区| 91在线精品| 亚洲欧美综合精品久久成人| 国产精品99在线观看| 免费网站在线观看视频| 日韩欧美高清视频| 精品国产一区二区三区性色av| 超碰在线97av| 久久蜜桃一区二区| a毛片在线看免费观看| 国产91免费看片| 成人深夜在线观看| 国产午夜精品一区理论片| 欧美高跟鞋交xxxxhd| 日韩中文字幕1| 在线小视频网址| 久久精品一区中文字幕| 蜜桃久久av| 久久成人在线视频| 高清在线视频不卡| 亚洲最大的免费| 中文字幕一区日韩精品欧美| heyzo中文字幕在线| 亚洲一区二区三区乱码aⅴ| 久久精品视频在线免费观看| 国产乱妇乱子在线播视频播放网站| 国产精品亚发布| 国产精品久久久久婷婷 | 亚洲精品久久久蜜桃| 色综合一本到久久亚洲91| 精品一区二区三区自拍图片区| 亚洲欧美日本在线| 99热这里有精品| 亚洲黄色一区二区三区| 欧美性受xxxx| 亚洲成av人电影| 橘梨纱av一区二区三区在线观看| 亚洲天堂久久av| 男女男精品视频网| 国产三级视频在线| 成人精品视频在线| 亚洲尤物在线视频观看| 欧美巨大xxxx| 国产wwwxx| 久久精品亚洲热| www.亚洲人| 狂野欧美性猛交xxxx| 人妻无码一区二区三区四区| 日韩免费一区二区三区在线播放| 狠狠爱www人成狠狠爱综合网| 99re6热在线精品视频播放| 8x海外华人永久免费日韩内陆视频 | 成人自拍视频网站| 亚洲二区在线视频| 国产精品一区二区三区av麻| 成人精品3d动漫| 日本高清+成人网在线观看| 国产精品福利一区| 神马香蕉久久| 最新av番号| 亚洲直播在线一区| 欧美性高清videossexo| 伊人成人在线视频| av在线免费网址| 亚洲自拍三区| 国产亚洲欧洲高清一区| 95精品视频在线| 在这里有精品| 88av在线| 岛国一区二区三区高清视频| 欧美日韩五月天| 成本人h片动漫网站在线观看| 亚洲精品国产品国语在线app| 天天躁日日躁狠狠躁欧美| 啊啊啊好爽视频| 成人欧美在线观看 | 波多野结衣av一区二区全免费观看| 日韩高清av一区二区三区| 国产精品一区二区三区网站| 欧美××××黑人××性爽| www.浪潮av.com| 奇米成人av国产一区二区三区| 亚洲一区二区三区不卡国产欧美| 欧美成人自拍| 伊人手机在线| 欧美,日韩,国产在线| 911国产网站尤物在线观看| 精品女厕一区二区三区| 国产一区二区三区的电影 | 一区二区三区动漫| 国产欧美精品区一区二区三区| 欧美激情在线免费| 精品99又大又爽又硬少妇毛片| 欧美黄色直播| xxx成人少妇69| 亚洲第一在线综合网站| 一区二区福利| 高清av一区二区三区| 99热在线网站| 中国成人亚色综合网站| 美日韩精品免费视频|