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

如何利用Scala簡化XML處理

開發(fā)
Scala容許您以多種方式導(dǎo)航和處理解析后的XML。它還為XML構(gòu)建提供了一流支持,因此無需創(chuàng)建XML字符串或以編程方式構(gòu)建DOM樹。在本文中,您將了解Scala在這些方面的實(shí)際效用以及Scala如何將XML處理轉(zhuǎn)變?yōu)橐环N樂事。

本文使用了 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)容以及對它執(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ù)提要。您可以針對個(gè)人執(zhí)行上述操作,即對指定的人員實(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 ?,F(xiàn)在您只需要訪問這個(gè) URL。這在 Java 代碼中很容易實(shí)現(xiàn),因此在 Scala 代碼也很容易??匆幌虑鍐?中訪問 FriendFeed 公共提要的代碼。

清單 1. 訪問 FriendFeed

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

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

清單 2. 訪問 friendFeed 方法

val feedXml = friendFeed

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

#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 示例

<feed>
 ?。糴ntry>
   ?。紆pdated>2008-03-26T05:06:36Z</updated>
   ?。約ervice>
     ?。紁rofileUrl>http://twitter.com/karlerikson</profileUrl>
     ?。糹d>twitter</id>
     ?。糿ame>Twitter</name>
    </service>
   ?。紅itle>Listening to Panic at the Disco on Kimmel</title>
   ?。糽ink>http://twitter.com/karlerikson/statuses/777188586</link>
   ?。紁ublished>2008-03-26T05:06:36Z</published>
   ?。糹d>f18ebf10-06be-98e2-6059-fa78fa44584b</id>
   ?。紆ser>
      <profileUrl>http://friendfeed.com/karlerikson</profileUrl>
     ?。糿ickname>karlerikson</nickname>
      <id>f294a86c-e6f3-11dc-8203-003048343a40</id>
     ?。糿ame>Karl Erikson</name>
   ?。?user>
  </entry>
  <entry>
   ?。紆pdated>2008-03-26T05:06:35Z</updated>
   ?。約ervice>
      <profileUrl>http://twitter.com/asfaq</profileUrl>
     ?。糹d>twitter</id>
     ?。糿ame>Twitter</name>
   ?。?service>
    <title>@ceetee lol</title>
   ?。糽ink>http://twitter.com/asfaq/statuses/777188582</link>
   ?。紁ublished>2008-03-26T05:06:35Z</published>
   ?。糹d>d4099bb0-8186-5aa1-ce1f-672246c0fe9c</id>
   ?。紆ser>
     ?。紁rofileUrl>http://friendfeed.com/asfaq</profileUrl>
     ?。糿ickname>asfaq</nickname>
     ?。糹d>41e24568-ee6b-11dc-a88d-003048343a40</id>
      <name>Asfaq</name>
   ?。?user>
 ?。?entry>
 ?。糴ntry>
    <updated>2008-03-26T05:06:31Z</updated>
   ?。約ervice>
     ?。紁rofileUrl>http://twitter.com/chrisjlee</profileUrl>
     ?。糹d>twitter</id>
     ?。糿ame>Twitter</name>
    </service>
    <title>sleep..</title>
   ?。糽ink>http://twitter.com/chrisjlee/statuses/777188561</link>
    <published>2008-03-26T05:06:31Z</published>
    <id>8c4ec232-3ad5-28e1-16c0-00a428294c9c</id>
    <user>
     ?。紁rofileUrl>http://friendfeed.com/chrisjlee</profileUrl>
     ?。糿ickname>chrisjlee</nickname>
     ?。糹d>5af39ad4-53b6-45d8-ae25-ef7c50fe9568</id>
     ?。糿ame>Chris</name>
    </user>
 ?。?entry>
 ?。糴ntry>
   ?。紆pdated>2008-03-26T05:06:49Z</updated>
    <service>
     ?。紁rofileUrl>
        http://www.google.com/reader/shared/09566745492004297397
     ?。?profileUrl>
      <id>googlereader</id>
     ?。糿ame>Google Reader</name>
   ?。?service>
    <title>Poketo First Editions Show!!</title>
   ?。糽ink>
      http://www.poketo.com/blog/2008/03/24/poketo-first-editions-show/
   ?。?link>
    <published>2008-03-26T05:06:49Z</published>
   ?。糹d>4caefceb-d71c-59c9-8199-45c5adbc60f2</id>
   ?。紆ser>
      <profileUrl>http://friendfeed.com/misterjt</profileUrl>
      <nickname>misterjt</nickname>
      <id>e745cc8a-f9e4-11dc-a477-003048343a40</id>
      <name>Jason Toney</name>
   ?。?user>
 ?。?entry>
</feed>

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

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

def filterFeed(feed:Elem, feedId:String):Seq[Node] = {
  var results = new Queue[Node]()
  feed"entry" foreach{(entry) =>
   if (search(entry"service""id" last, feedId)){
    results += (entry"user""nickname").last
   }
  }
  return results
}
def search(p:Node, Name:String):Boolean = p match {
  case <id>{Text(Name)}</id> => true
  case _ => false
}

您的函數(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ì)列對象的函數(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è)簡單的例子證明了 Scala 中模式匹配的強(qiáng)大功能。下面您將會(huì)明白如何構(gòu)建 XML 結(jié)構(gòu)。

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

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

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

def add(p:Node, newEntry:Node ):Node = p match {
  case <UserList>{ ch @ _* }</UserList> =>
   <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)的其他方法。

#p#

創(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é)果

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

由于 Scale 提供了對 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ù)將不返回任何值。在 Scale 中您可以通過聲明函數(shù)返回 Any 來解決這個(gè)問題。Any 類在 Scala 中是一個(gè)原始的類,類似于 java.lang.Object。Scale 沒有 void 類型,但是有一個(gè)等價(jià)的 Unit 類型。它的優(yōu)點(diǎn)是可以擴(kuò)展 Any 類,并且允許函數(shù)在某些情況下返回對象,而在其他時(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

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

您的函數(shù)要求 HashMap 的鍵是服務(wù)的名稱,其值為服務(wù)在 FriendFeed 中出現(xiàn)的次數(shù)。這個(gè)函數(shù)使用熟悉的 foreach-closure 風(fēng)格遍歷 HashMap,然后使用 HashMap 的名稱/值對創(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)?,F(xiàn)在準(zhǔn)備好了所有函數(shù),您只需驅(qū)動(dòng)程序以便進(jìn)行測試。

運(yùn)行和測試

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

清單 8. FriendFeed main 方法

def main(args:Array[String]) = {
  val feedXml = friendFeed
  var map = new HashMap[String,Int]
  args.foreach{(serviceName) =>
   val filteredEntries = filterFeed(feedXml, serviceName)
   var users:Node = <UserList/>
   filteredEntries.foreach{(user) =>
    users = add(users, user)
   }
   map += serviceName -> filteredEntries.length
   println(results(serviceName,filteredEntries.length,users))
  }
  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)行程序

$ scalac FriendFeed.scala
$ scala FriendFeed googlereader flickr delicious twitter blog
<Service id="twitter"><UserList><nickname>ntamaoki</nickname>
<nickname>terrazi</nickname><nickname>ntamaoki</nickname>
<nickname>terrazi</nickname><nickname>ntamaoki</nickname>
<nickname>parodi</nickname><nickname>trevor</nickname>
<nickname>cindy</nickname><nickname>christinelu</nickname>
<nickname>clint</nickname><nickname>savvyauntie</nickname>
<nickname>44gi</nickname></UserList></Service>
<Serviceid="blog"><UserList><nickname>nechipor</nickname>
<nickname>mdolla</nickname><nickname>kyhpudding</nickname>
<nickname>hanayuu</nickname><nickname>hanayuu</nickname>
</UserList></Service><Stats><Service cnt="12" id="twitter">
</Service><Service cnt="0" id="delicious"></Service><Service
cnt="0" id="flickr"></Service><Service cnt="0" id="googlereader">
</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ù)。而 Scale 做到了這一點(diǎn)。它使得復(fù)雜問題變得簡單。查看本文使用 Scale 執(zhí)行的所有功能,想像一下做同樣的事情需要使用多少行 Java 代碼。

【編輯推薦】

  1. XML在Web應(yīng)用中的優(yōu)勢
  2. 用XML和XSL來生成動(dòng)態(tài)頁面
  3. 在ASP.NET中使用Treeview控件和XML
責(zé)任編輯:楊鵬飛 來源: IBM
相關(guān)推薦

2009-06-22 14:26:12

ScalaXML對象

2009-07-22 07:47:00

Scala客戶代碼

2013-12-08 21:16:21

BaaS企業(yè)級(jí)移動(dòng)移動(dòng)信息化

2014-02-20 09:50:15

云存儲(chǔ)云服務(wù)工作流程

2025-04-07 04:00:00

AngularTypeScript裝飾器

2010-01-08 13:25:07

ibmdwXML

2009-06-10 21:51:42

JavaScript XMLFirefox

2022-02-21 10:29:26

物聯(lián)網(wǎng)招聘IOT

2009-08-21 16:17:25

ScalaTwitter API

2014-01-07 10:12:15

Spark

2022-06-09 10:42:47

GoJSON

2009-06-22 17:57:26

IExtendProv

2025-01-15 00:01:00

開發(fā)應(yīng)用界面

2009-09-09 10:50:55

Scala例子Scala與Java

2023-04-17 10:10:42

2019-04-10 10:42:52

簡化Windows 10遷移

2023-08-11 17:19:03

2010-09-09 13:55:47

XML DOM

2023-04-28 14:52:26

2024-04-30 08:00:00

人工智能自動(dòng)化文件處理
點(diǎn)贊
收藏

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

风间由美一区二区av101| 国产精品亚洲综合| 一区二区三区四区视频在线观看 | 内衣办公室在线| 91精品麻豆| 久久这里都是精品| 欧美俄罗斯性视频| 欧美男女交配视频| 欧洲亚洲在线| 99热在线精品观看| 精品美女在线播放| 天堂av免费看| 在线免费av片| 成人3d动漫在线观看| 懂色av影视一区二区三区| 97自拍视频| 成人信息集中地| 亚洲www啪成人一区二区| 成人动漫中文字幕| 欧美激情一二区| 天天做天天干天天操| 婷婷视频在线| 久久精品国产77777蜜臀| 亚洲欧美国产一本综合首页| 国产 日韩 欧美在线| 亚洲男人天堂久久| 欧美日一区二区三区在线观看国产免| 91精品国产欧美一区二区| 日韩视频在线免费播放| 五月婷婷丁香六月| 国产精品社区| 亚洲欧美国产一区二区三区| 中文字幕亚洲日本| av免费不卡国产观看| 91视频你懂的| 国产a∨精品一区二区三区不卡| 北岛玲一区二区| 亚洲色图官网| 国产女人水真多18毛片18精品视频 | 婷婷成人综合网| 国产精品一区二区三区不卡| 亚洲最新av网站| 日韩影院在线观看| 色综合影院在线| 日韩欧美中文视频| 爱看av在线入口| 91麻豆视频网站| 国产精品免费一区二区三区观看 | 日韩一区二区免费在线电影| mm131午夜| 懂色av成人一区二区三区| 久久精品99久久久| 国产精品美乳一区二区免费 | 国产高潮流白浆喷水视频| 欧美一区二区| 亚洲高清在线观看| 日本成人黄色网| av免费在线网站| 99精品欧美一区| 国产精品视频久久久久| 一二三区免费视频| 一个色综合网| 亚洲欧美变态国产另类| 国产精品无码一区二区三区免费| 丁香婷婷久久| 亚洲国产人成综合网站| 日韩中文字幕一区二区| 亚洲xxx在线| 日韩影院在线观看| 国产精品免费视频xxxx| 亚洲熟妇无码久久精品| 精品影视av免费| 51午夜精品视频| 黑人操日本美女| 日韩一级电影| 日韩视频免费直播| 好吊操视频这里只有精品| 亚洲天堂1区| 欧美三级蜜桃2在线观看| 国产欧美日韩网站| 漫画在线观看av| 亚洲精品乱码久久久久久黑人 | 高h调教冰块play男男双性文| 国产1区2区3区精品美女| 国产成人精品一区二区在线| 久久午夜无码鲁丝片午夜精品| 欧洲杯足球赛直播| 亚洲精品98久久久久久中文字幕| 99九九99九九九99九他书对| 国产免费av国片精品草莓男男| 在线观看欧美精品| 亚洲 欧美 日韩 国产综合 在线| 韩国中文字幕在线| 国产欧美一二三区| 99精品视频网站| 爱草tv视频在线观看992| 亚洲蜜臀av乱码久久精品蜜桃| 欧美日韩精品免费观看| 人成网站在线观看| 国产成人精品1024| 你懂的网址一区二区三区| 亚洲精品一区二区口爆| 久久综合九色综合欧美就去吻| 日韩在线国产| 日本片在线观看| 亚洲婷婷国产精品电影人久久| 日韩福利视频| 影音先锋在线播放| 色av一区二区| 成人在线观看a| 亚洲同志男男gay1069网站| 五月激情综合网| 日本人69视频| 亚洲成a人片777777久久| 欧美视频日韩视频在线观看| 熟女人妇 成熟妇女系列视频| 精品国产亚洲一区二区三区| 7777女厕盗摄久久久| 亚洲美女性囗交| 青青草久久爱| 亚洲男人av在线| 丰满少妇被猛烈进入一区二区| 影视一区二区| 国产精品久久久久久久久久| 亚洲视频中文字幕在线观看| av成人老司机| 久久天天狠狠| 国产三级视频在线| 中文字幕中文字幕一区| mm131午夜| 成人影院在线免费观看| 亚洲国内精品在线| 丝袜 亚洲 另类 欧美 重口| 免费久久99精品国产| 91亚洲国产成人精品性色| 亚洲av无码片一区二区三区| 亚洲国产高清在线| 99热这里只有精品7| 欧美大片1688网站| 亚洲精品综合久久中文字幕| 国产特黄大片aaaa毛片| 天堂蜜桃一区二区三区| 国产精自产拍久久久久久| 99视频免费看| 亚洲欧洲成人精品av97| 成品人视频ww入口| 欧美性xxx| 这里是久久伊人| 一本一本久久a久久| 日韩精品电影一区亚洲| 欧美综合77777色婷婷| 黄色在线视频网站| 欧美日韩国产综合久久| 中国黄色片视频| 欧美在线电影| 国产精品久久久久久久久久免费 | 久久久久久久久黄色| 美腿丝袜在线亚洲一区| 日韩精品久久一区二区三区| 少妇一区视频| 日韩视频免费直播| 2021亚洲天堂| 丝袜脚交一区二区| 日韩免费中文专区| av在线播放一区| 日韩中文字幕在线视频播放| 国产一级特黄aaa大片| 日韩二区三区四区| 久久爱av电影| 日韩精品免费观看视频| www.精品av.com| 99热这里只有精品在线| 亚洲成人av免费| 亚洲蜜桃精久久久久久久久久久久| 亚洲欧美日本国产专区一区| 亚洲最大福利视频网| 婷婷av在线| 日韩国产高清视频在线| 成人免费毛片东京热| 成人性生交大合| 男女啪啪的视频| 澳门久久精品| 久久影视电视剧免费网站清宫辞电视| 亚洲免费黄色网址| 成人教育av在线| 成人在线免费观看av| 中文在线免费一区三区| 日韩中文字幕精品视频| 精品人妻一区二区三区四区不卡 | 日韩精品一区二| 少妇av片在线观看| 亚洲欧美日韩一区在线观看| 污视频在线免费观看一区二区三区| 免费v片在线观看| 亚洲欧美中文日韩在线v日本| 国产一级二级三级视频| 视频在线在亚洲| 9l视频自拍9l视频自拍| 欧美亚洲tv| 成人在线小视频| 日韩精品极品| 久久在线视频在线| 欧美日韩在线中文字幕| 91麻豆精品国产| 国产精品视频123| 自拍偷拍亚洲综合| 草草地址线路①屁屁影院成人| 久久99精品久久久久久国产越南 | 欧美一区二区在线视频| youjizz在线视频| 亚洲免费观看高清在线观看| 国产交换配乱淫视频免费| 国产精品毛片在线看| 中文字幕一区二区三区在线乱码 | 国产精品多人| 91超碰在线电影| 日本欧美不卡| 97人人爽人人喊人人模波多 | 天天操天天爽天天干| 中文字幕一区免费在线观看| 一本色道综合久久欧美日韩精品 | 亚洲影院色无极综合| 欧洲美女少妇精品| 91精品在线观看入口| 天堂网中文字幕| 亚洲国产中文字幕| 久久久久9999| 国产高清精品网站| 久久在线中文字幕| 亚洲电影影音先锋| 成人欧美一区二区| 精精国产xxxx视频在线播放| 久久精品欧美视频| 性生交生活影碟片| 欧美男女性生活在线直播观看| 少妇人妻丰满做爰xxx| 国产日韩综合av| 日韩av.com| 日本系列欧美系列| 韩国无码av片在线观看网站| 国产精品自在线拍| 亚洲最大福利视频网| 久久中文字幕一区二区| 91久久国产婷婷一区二区| 免费在线成人激情电影| 国产精品69av| 精品无人乱码一区二区三区| 国产成人精品综合| 日韩欧美精品电影| 国产精品视频免费在线| 久久麻豆视频| 久精品免费视频| 国产一级片在线| 欧美成人精品3d动漫h| 国内老熟妇对白xxxxhd| 日韩久久久精品| 午夜久久久久久久久久| 精品伦理精品一区| 黄色片一区二区三区| 亚洲成人在线视频播放| 视频二区在线| 欧美一区二区三区视频免费播放| 国产乱码精品一区二三区蜜臂 | 三级视频在线观看| 日韩欧美大尺度| 朝桐光av在线| 亚洲一区二区三区视频在线| 久久精品视频6| 欧美日韩另类字幕中文| 波多野结衣在线观看视频| 一区二区三区 在线观看视频| 在线免费观看日韩av| 国产精品1区2区3区在线观看| 人妻激情偷乱视频一区二区三区| 丁香婷婷综合五月| 黄色a一级视频| 国产精品久久久久久一区二区三区 | 欧美电影h版| 国产美女搞久久| 欧洲大片精品免费永久看nba| 国产a级全部精品| 日本中文字幕视频一区| 91沈先生播放一区二区| 日韩欧美天堂| 黄色www在线观看| 影音先锋一区| 影音先锋成人资源网站| 色婷婷色综合| 天堂一区二区三区| 91精品国产乱码久久久久久| 日本精品久久久久久久久久| 久久精品一区| 久久网站免费视频| 毛片不卡一区二区| 国产艳妇疯狂做爰视频| 国产传媒日韩欧美成人| 国产精品1000部啪视频| 亚洲三级在线观看| 手机看片久久久| 日韩一区二区三区高清免费看看| 色视频在线观看| 欧美成人精品一区| 麻豆最新免费在线视频| 国内精品视频一区| 国产黄色大片在线观看| 国产精品亚洲综合天堂夜夜| 成人三级av在线| 一区二区成人国产精品| 国产精品三上| 亚洲成人激情小说| 国产精品美女久久久久aⅴ | 亚洲欧洲午夜| 国产成人艳妇aa视频在线| 欧美精品导航| 91国产精品视频在线观看| 日产国产高清一区二区三区| 国产精久久久久| 国产精品久久久久久久久图文区| 尤物视频在线观看国产| 日韩欧美一区中文| 暖暖日本在线观看| 国产精品第2页| 香蕉视频一区| 精品视频在线观看一区| 国产精品自拍一区| 欧洲成人午夜精品无码区久久| 国产精品妹子av| 精品人妻一区二区三区潮喷在线 | 亚洲天天影视| 国产不卡在线观看| 日韩三级视频| aa在线观看视频| 国产激情一区二区三区桃花岛亚洲| 免费成人深夜蜜桃视频| 在线视频欧美精品| 青青草视频在线观看| 91极品视频在线| 欧美日韩五区| 日本一区网站| 老牛嫩草一区二区三区日本| 无码熟妇人妻av| 欧美性xxxxxxx| 深夜福利在线看| 欧美一区二区.| 欧美精品第一区| 色婷婷777777仙踪林| 精品亚洲国产成人av制服丝袜| 精品国产午夜福利在线观看| 国产精品黄色在线观看| 在线观看日韩一区二区| 综合网日日天干夜夜久久| 污视频在线免费观看网站| 7777精品伊久久久大香线蕉语言| 午夜精品一区二区三区国产 | 不卡视频一二三| 日本学生初尝黑人巨免费视频| 精品剧情在线观看| 国产夫妻在线| 久久综合中文色婷婷| 丝袜美腿亚洲综合| 美国黄色特级片| 亚洲国产成人porn| 天天操天天爱天天干| 久久视频在线观看免费| 国产一区二区高清在线| 欧美高清中文字幕| 99九九99九九九视频精品| 性色av免费观看| 色偷偷9999www| 日韩在线精品强乱中文字幕| h无码动漫在线观看| 97久久人人超碰| 艳妇乳肉豪妇荡乳av无码福利| 亚洲国产天堂网精品网站| 久久青草伊人| 日韩.欧美.亚洲| 国产麻豆精品在线观看| 日韩精品一区二区av| 国产亚洲成av人片在线观看桃| 丰乳肥臀在线| 人偷久久久久久久偷女厕| 精品一区二区免费在线观看| 久久久久人妻一区精品色欧美| 亚洲精品aⅴ中文字幕乱码| 欧美成人精品三级网站| 看一级黄色录像| 91丨porny丨在线| 91午夜交换视频| 中文综合在线观看| 911亚洲精品| 青青在线免费观看视频| 亚洲视频一区在线观看| 国模私拍视频在线| 国产精品久久91| 韩国在线一区| 公肉吊粗大爽色翁浪妇视频| 日韩欧美一区二区久久婷婷| 欧美精品日日操| 亚洲中文字幕无码一区二区三区| 久久先锋影音av鲁色资源|