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

超強解析XML——簡單直接的來

開發 前端
解析豆瓣返回的xml,實在是不想用DOM這個重量級的玩意。DOM這個玩意,說它強大好還是說它官僚好呢。我傾向于使用SAXP解析。但是現在面臨的一個問題是,我需要根據xml節點的名字和屬性值(一個或者多個)來決定當前的值是不是我想要的。

對于現在越來越輕量級,越來越講究速度和接近用戶的應用來說,xml確實有點復雜了。解析起來不僅耗內存,而且很復雜。這就好像花了幾千塊錢買了個MS Office,但是80%的feature都用不著,還白白的耗著CPU和內存。個人覺得,設置文件用XML其實挺好,因為設置文件一般并不太大,而且要求可讀性強,還有很多亂七八糟的需求,可以利用XML的力量。昨天搞chrome的設置,發現chrome的設置文件也是使用的json,讀起來也是輕松愉快。前陣子做了個程序,需要解析豆瓣API調用返回的XML。真想說一句,豆瓣你別用XML了。至少,提供個json版的API調用吧。(以上謹代表個人觀點)

解析豆瓣返回的xml,實在是不想用DOM這個重量級的玩意。DOM這個玩意,說它強大好還是說它官僚好呢。我傾向于使用SAXP解析。但是現在面臨的一個問題是,我需要根據xml節點的名字和屬性值(一個或者多個)來決定當前的值是不是我想要的。這就麻煩一點點。***反應是考慮xpath。后來覺得不如自己做一個得了,權當是按需定制一個輕量級的xpath。

首先定義XMLSearchUnit類,這個類的實例用來描述一個需要在XML中搜索的值,值可以是xml節點的值,或者是節點的屬性。

  1. package com.deepnighttwo.resourceresolver.douban.resolver.utils;  
  2.  
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.  
  6. import org.xml.sax.Attributes;  
  7.  
  8. /**  
  9.  *   
  10.  * Represent a search task. Target could be value of a node or attribute of the  
  11.  * node.  
  12.  *   
  13.  * @author mzang  
  14.  */  
  15. public class XMLSearchUnit {  
  16.  
  17.     // attribute values to be matched during search  
  18.     private Map<String, String> attributeMatchValidation = new HashMap<String, String>();  
  19.  
  20.     // if target is an attribute, then set this member to be the attribute name.  
  21.     // if it is null or empty, then means the target is node value.  
  22.     private String expectedAttr;  
  23.  
  24.     // xml path, format is: /node_name/node_name/...  
  25.     private String xmlPath;  
  26.  
  27.     public XMLSearchUnit(String xmlPath) {  
  28.         this.xmlPath = xmlPath;  
  29.     }  
  30.  
  31.     /**  
  32.      * if current node meets the search conditions or not. Meets means the path  
  33.      * is correct and the attribute value is matched.  
  34.      *   
  35.      * @param path  
  36.      * @param attributes  
  37.      * @return  
  38.      */  
  39.     public boolean match(String path, Attributes attributes) {  
  40.         if (xmlPath.equals(path) == false) {  
  41.             return false;  
  42.         }  
  43.  
  44.         for (String key : attributeMatchValidation.keySet()) {  
  45.             String exp = attributeMatchValidation.get(key);  
  46.             String compare = attributes.getValue(key);  
  47.             if (exp.equalsIgnoreCase(compare) == false) {  
  48.                 return false;  
  49.             }  
  50.         }  
  51.         return true;  
  52.     }  
  53.  
  54.     public Map<String, String> getAttributeMatchValidation() {  
  55.         return attributeMatchValidation;  
  56.     }  
  57.  
  58.     public void addAttributeValidation(String key, String value) {  
  59.         attributeMatchValidation.put(key, value);  
  60.     }  
  61.  
  62.     public String getXmlPath() {  
  63.         return xmlPath;  
  64.     }  
  65.  
  66.     public void setAttributeMatchValidation(  
  67.             Map<String, String> attributeMatchValidation) {  
  68.         this.attributeMatchValidation = attributeMatchValidation;  
  69.     }  
  70.  
  71.     public String getExpectedAttr() {  
  72.         return expectedAttr;  
  73.     }  
  74.  
  75.     /**  
  76.      * if target is node value, then set expectedAttr to null. if target is an  
  77.      * attribute value, set it to be the attribute name.  
  78.      *   
  79.      * @param expectedAttr  
  80.      */  
  81.     public void setExpectedAttr(String expectedAttr) {  
  82.         this.expectedAttr = expectedAttr;  
  83.     }  
  84.  
  85.     /**  
  86.      * hash code can be cached if all properties are not be be changed.  
  87.      */  
  88.     @Override  
  89.     public int hashCode() {  
  90.         final int prime = 31;  
  91.         int result = 1;  
  92.         result = prime 
  93.                 * result  
  94.                 + ((attributeMatchValidation == null) ? 0  
  95.                         : attributeMatchValidation.hashCode());  
  96.         result = prime * result  
  97.                 + ((expectedAttr == null) ? 0 : expectedAttr.hashCode());  
  98.         result = prime * result + ((xmlPath == null) ? 0 : xmlPath.hashCode());  
  99.         return result;  
  100.     }  
  101.  
  102.     @Override  
  103.     public boolean equals(Object obj) {  
  104.         if (this == obj)  
  105.             return true;  
  106.         if (obj == null)  
  107.             return false;  
  108.         if (getClass() != obj.getClass())  
  109.             return false;  
  110.         XMLSearchUnit other = (XMLSearchUnit) obj;  
  111.         if (attributeMatchValidation == null) {  
  112.             if (other.attributeMatchValidation != null)  
  113.                 return false;  
  114.         } else if (!attributeMatchValidation  
  115.                 .equals(other.attributeMatchValidation))  
  116.             return false;  
  117.         if (expectedAttr == null) {  
  118.             if (other.expectedAttr != null)  
  119.                 return false;  
  120.         } else if (!expectedAttr.equals(other.expectedAttr))  
  121.             return false;  
  122.         if (xmlPath == null) {  
  123.             if (other.xmlPath != null)  
  124.                 return false;  
  125.         } else if (!xmlPath.equals(other.xmlPath))  
  126.             return false;  
  127.         return true;  
  128.     }  
  129.  

這個類比較簡單。就是用一個hashmap保待匹配的attribut鍵值對,用一個字符串表示期待的attribute name,用一個字符串表示期待的node path。

然后就是如何在SAXP里用到這個類的實例去搜索了。
 

  1. package com.deepnighttwo.resourceresolver.douban.resolver.utils;  
  2.  
  3. import java.io.InputStream;  
  4. import java.util.ArrayList;  
  5. import java.util.HashMap;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8.  
  9. import javax.xml.parsers.SAXParser;  
  10. import javax.xml.parsers.SAXParserFactory;  
  11.  
  12. import org.xml.sax.Attributes;  
  13. import org.xml.sax.InputSource;  
  14. import org.xml.sax.SAXException;  
  15. import org.xml.sax.XMLReader;  
  16. import org.xml.sax.helpers.DefaultHandler;  
  17.  
  18. /**  
  19.  *   
  20.  * SAXP parser working with XMLSearchUnit.  
  21.  *   
  22.  * @author mzang  
  23.  */  
  24.  
  25. public class DoubanSearchParser extends DefaultHandler {  
  26.  
  27.     // create and initial search units  
  28.     public static final XMLSearchUnit DETAILS_LINK_API_PATH = new XMLSearchUnit(  
  29.             "/feed/entry/id");  
  30.  
  31.     public static final XMLSearchUnit DETAILS_CONTENT_PATH = new XMLSearchUnit(  
  32.             "/entry/summary");  
  33.  
  34.     public static final XMLSearchUnit DETAILS_TITLE_PATH = new XMLSearchUnit(  
  35.             "/entry/title");  
  36.  
  37.     public static final XMLSearchUnit DETAILS_CHINESE_NAME_PATH = new XMLSearchUnit(  
  38.             "/entry/db:attribute");  
  39.  
  40.     public static final XMLSearchUnit DETAILS_RATINGE_PATH = new XMLSearchUnit(  
  41.             "/entry/gd:rating");  
  42.  
  43.     public static final XMLSearchUnit DETAILS_RATINGE_RATER_COUNT_PATH = new XMLSearchUnit(  
  44.             "/entry/gd:rating");  
  45.  
  46.     public static final XMLSearchUnit DETAILS_LINK_URL_PATH = new XMLSearchUnit(  
  47.             "/feed/entry/link");  
  48.  
  49.     static {  
  50.         DETAILS_LINK_URL_PATH.addAttributeValidation("rel", "alternate");  
  51.         DETAILS_LINK_URL_PATH.setExpectedAttr("href");  
  52.  
  53.         DETAILS_CHINESE_NAME_PATH.addAttributeValidation("lang", "zh_CN");  
  54.         DETAILS_CHINESE_NAME_PATH.addAttributeValidation("name", "aka");  
  55.  
  56.         DETAILS_RATINGE_PATH.setExpectedAttr("average");  
  57.  
  58.         DETAILS_RATINGE_RATER_COUNT_PATH.setExpectedAttr("numRaters");  
  59.  
  60.     }  
  61.  
  62.     // a map to store the XMLSearchUnit and value  
  63.     private Map<XMLSearchUnit, String> results = new HashMap<XMLSearchUnit, String>();  
  64.  
  65.     // a counter of search unit. if it is 0, then all search unit finds a match  
  66.     // value and the result of the XML will be skipped.  
  67.     private int count = 0;  
  68.  
  69.     private StringBuilder path = new StringBuilder();  
  70.  
  71.     private static final String pathSeparater = "/";  
  72.  
  73.     private XMLSearchUnit[] searchUnits;  
  74.  
  75.     List<XMLSearchUnit> foundItems = new ArrayList<XMLSearchUnit>();  
  76.  
  77.     /**  
  78.      * constructor, accept XML input stream, 0 or more search unit instances.  
  79.      *   
  80.      * @param input  
  81.      * @param expectedPath  
  82.      * @return  
  83.      */  
  84.     public Map<XMLSearchUnit, String> parseResults(InputStream input,  
  85.             XMLSearchUnit... expectedPath) {  
  86.         for (XMLSearchUnit search : expectedPath) {  
  87.             results.put(search, null);  
  88.         }  
  89.  
  90.         searchUnits = expectedPath;  
  91.  
  92.         count = expectedPath.length;  
  93.  
  94.         XMLReader xmlReader = null;  
  95.         try {  
  96.             SAXParserFactory spfactory = SAXParserFactory.newInstance();  
  97.             spfactory.setValidating(false);  
  98.             SAXParser saxParser = spfactory.newSAXParser();  
  99.             xmlReader = saxParser.getXMLReader();  
  100.             xmlReader.setContentHandler(this);  
  101.             xmlReader.parse(new InputSource(input));  
  102.         } catch (Exception e) {  
  103.             System.err.println(e);  
  104.             System.exit(1);  
  105.         }  
  106.         return results;  
  107.     }  
  108.  
  109.     private void addToPath(String addPath) {  
  110.         path.append(pathSeparater).append(addPath.toLowerCase());  
  111.     }  
  112.  
  113.     private void popPath() {  
  114.         int index = path.lastIndexOf(pathSeparater);  
  115.         // String removedPath = path.substring(index);  
  116.         path.delete(index, path.length());  
  117.     }  
  118.  
  119.     @Override  
  120.     public void startElement(String uri, String localName, String qName,  
  121.             Attributes attributes) throws SAXException {  
  122.         foundItems.clear();  
  123.         if (count == 0) {  
  124.             return;  
  125.         }  
  126.  
  127.         // update path  
  128.         addToPath(qName);  
  129.  
  130.         List<XMLSearchUnit> foundAttrItems = null;  
  131.  
  132.         // check if current node matches search units. if it is a node value  
  133.         // search, then store it in a member variable named foundItems because  
  134.         // the value of the node is known only when reaches the end of the  
  135.         // node.but for attribute search, it value is known here. So then are  
  136.         // put in a local variable list named foundAttrItems.  
  137.         for (XMLSearchUnit unit : searchUnits) {  
  138.             if (unit.match(path.toString(), attributes) == true) {  
  139.  
  140.                 if (unit.getExpectedAttr() == null) {  
  141.                     foundItems.add(unit);  
  142.                 } else {  
  143.                     if (foundAttrItems == null) {  
  144.                         foundAttrItems = new ArrayList<XMLSearchUnit>();  
  145.                     }  
  146.                     foundAttrItems.add(unit);  
  147.                 }  
  148.             }  
  149.         }  
  150.         // if no attribute match, return.  
  151.         if (foundAttrItems == null) {  
  152.             return;  
  153.         }  
  154.  
  155.         // fill search unit value using attribute value. update count.  
  156.         for (XMLSearchUnit attrUnit : foundAttrItems) {  
  157.             String attrValue = attributes.getValue(attrUnit.getExpectedAttr());  
  158.             if (results.get(attrUnit) == null) {  
  159.                 count--;  
  160.             }  
  161.             results.put(attrUnit, attrValue);  
  162.             count--;  
  163.         }  
  164.     }  
  165.  
  166.     /**  
  167.      * if current node matches, the the node value is useful, store it.  
  168.      */  
  169.     @Override  
  170.     public void characters(char[] ch, int start, int length)  
  171.             throws SAXException {  
  172.         if (count == 0) {  
  173.             return;  
  174.         }  
  175.         if (foundItems.size() == 0) {  
  176.             return;  
  177.         }  
  178.  
  179.         for (XMLSearchUnit unit : foundItems) {  
  180.             String content = new String(ch, start, length);  
  181.             if (results.get(unit) == null) {  
  182.                 count--;  
  183.             }  
  184.             results.put(unit, content);  
  185.         }  
  186.     }  
  187.  
  188.     @Override  
  189.     public void endElement(String uri, String localName, String qName)  
  190.             throws SAXException {  
  191.         foundItems.clear();  
  192.         if (count == 0) {  
  193.             return;  
  194.         }  
  195.         popPath();  
  196.     }  

原文鏈接:http://www.cnblogs.com/deepnighttwo/archive/2011/03/13/1982748.html

【編輯推薦】

  1. 解析PHP中的XML數據
  2. 詳解用PHP讀取和編寫XML DOM
  3. 利用DOM解析XML文檔實例
  4. XML DOM新手入門指南
  5. 構建輕量級XML DOM分析程序
責任編輯:陳貽新 來源: Mark Zang的博客
相關推薦

2009-01-04 16:58:48

LINQ to XMLLINQXML

2021-07-29 10:00:43

XMLXMLStarletLinux

2012-08-16 15:56:33

XML

2009-02-17 11:23:08

2011-02-22 14:10:25

PHPXML

2009-07-07 14:11:07

XML來配置Servl

2012-05-23 13:17:43

JavaJdomXML

2013-06-08 11:04:18

Android開發Pull解析XMLAndroid XML

2009-09-09 14:40:15

C# XML解析

2022-04-11 08:25:37

XMLSQL語句Mybatis

2016-11-14 19:45:39

JavaScript

2010-06-17 23:13:10

路由信息協議

2015-08-12 10:04:24

2011-08-04 18:39:32

iOS XML

2022-03-22 09:41:31

Java編程語言持久化

2016-02-16 10:26:58

PythonXML方式

2009-09-07 15:27:04

C# MessageB

2010-01-25 18:22:33

Android使用XM

2010-07-26 15:06:29

Perl解析XML文件

2014-12-31 14:09:23

xml解析
點贊
收藏

51CTO技術棧公眾號

五月天婷婷影视| 亚洲精品tv久久久久久久久| 中文字幕精品三级久久久| 国产精品片aa在线观看| 欧美另类高清zo欧美| 中文字幕日韩精品无码内射| 午夜视频福利在线| 久久99九九99精品| 97国产精品免费视频| ass极品国模人体欣赏| 91久久精品无嫩草影院| 在线观看免费一区| 欧妇女乱妇女乱视频| 成人影院免费观看| 成人爽a毛片一区二区免费| 国产91久久婷婷一区二区| 手机在线免费看片| 国产精品入口久久| 亚洲第一色在线| 中文字幕视频三区| 成人软件在线观看| 亚洲综合色区另类av| 伊人久久大香线蕉综合75| 蜜芽tv福利在线视频| 国产成人日日夜夜| 成人高清视频观看www| 一级做a爰片久久毛片| 黄色在线成人| 成年人精品视频| 永久免费观看片现看| 精品一区在线| 日韩av一区二区在线观看| 中文字幕在线播放一区二区| 91国产一区| 欧美日韩亚洲丝袜制服| www黄色在线| 色吧亚洲日本| 午夜国产精品影院在线观看| 国产尤物av一区二区三区| 日本视频在线观看| 国产女人aaa级久久久级| 久久精品五月婷婷| 天天舔天天干天天操| 国产在线观看免费一区| 91精品久久久久久久久久入口| 中文字幕日本人妻久久久免费| 丝袜诱惑亚洲看片| 国产99久久久欧美黑人 | 欧美一级片久久久久久久| 九九精品在线观看视频| 欧美1区3d| 欧美丰满少妇xxxx| 久视频在线观看| 国产精品mv在线观看| 美女撒尿一区二区三区| 青青草原免费观看| 狠狠色综合网| 高清欧美一区二区三区| 国产精品a成v人在线播放| 亚洲作爱视频| 国产成人啪精品视频免费网| 天天干天天插天天射| 麻豆一区二区99久久久久| 国产欧美精品在线播放| 国产乱码精品一区二区| 国产成人在线视频免费播放| 国产91视觉| 亚洲欧美综合一区二区| 久久久噜噜噜久久人人看 | 韩国黄色一级片| 精品自拍偷拍| 亚洲欧洲xxxx| 亚洲色图 激情小说| 91精品啪在线观看国产18| 欧美人成在线视频| 青青草av在线播放| 热久久免费视频| 97免费资源站| 青青青手机在线视频观看| 中文字幕免费观看一区| 好色先生视频污| 日韩深夜视频| 91麻豆精品国产无毒不卡在线观看| 中文字幕在线观看视频www| 三级精品视频| 日韩中文在线观看| 国产精品 欧美 日韩| 久久大逼视频| 91亚洲精品久久久| 国产精品国产高清国产| 国产精品视频一二三区| www国产无套内射com| 英国三级经典在线观看| 日韩一区二区在线看| www国产视频| 欧美h版在线| 午夜精品一区二区三区av| 中文字幕无码乱码人妻日韩精品| 国产精品911| 日韩精彩视频| 免费在线观看的电影网站| 91传媒视频在线播放| 中文字幕18页| 91久久夜色精品国产按摩| 午夜精品视频在线| 国产裸体永久免费无遮挡| 久久久久国产免费免费| 97中文字幕在线| 懂色aⅴ精品一区二区三区| 亚洲成年人在线播放| 成人免费视频入口| 亚洲欧美日韩国产一区二区| 51国偷自产一区二区三区的来源| 成年人视频免费在线观看| 亚洲一二三区视频在线观看| 亚洲xxx在线观看| 国产日韩视频在线| 欧美一级淫片aaaaaaa视频| av中文字幕免费| 欧美激情一二三区| 狠狠爱免费视频| 国产精品极品在线观看| 久久av红桃一区二区小说| 亚洲图片欧美日韩| 91色|porny| 日本中文字幕网址| 成人av动漫| 久久国产色av| 国产又粗又长又大视频| 欧美国产日韩一二三区| 国产淫片av片久久久久久| 欧美一区 二区| 欧美激情第99页| www.亚洲欧美| 伊人夜夜躁av伊人久久| 国产999免费视频| 91免费精品| 国产色视频一区| 思思99re6国产在线播放| 在线观看不卡视频| 少妇无套高潮一二三区| 巨乳诱惑日韩免费av| 日韩中文字幕一区二区| 四虎成人在线| 在线视频亚洲欧美| 中文字幕你懂的| ...xxx性欧美| 国产欧美精品一二三| 亚洲成av人片一区二区密柚| 亚洲va久久久噜噜噜| 国产网友自拍视频导航网站在线观看| 91麻豆精品久久久久蜜臀| 欧美成人手机视频| 成人aa视频在线观看| 男人操女人逼免费视频| 美女久久久久| 国产精品男女猛烈高潮激情| 91福利在线视频| 91超碰这里只有精品国产| 国产精品白嫩白嫩大学美女| 粉嫩aⅴ一区二区三区四区五区| av免费观看国产| 日韩系列在线| 国产精品女主播| 老司机在线永久免费观看| 欧美一级夜夜爽| jizz国产免费| 国产视频911| 99九九精品视频| 亚洲香蕉网站| 欧洲亚洲一区二区三区四区五区| 国产福利91精品一区二区| 久久综合免费视频影院| 人人妻人人玩人人澡人人爽| 色婷婷国产精品| 97在线观看免费高| 不卡一区中文字幕| 欧美婷婷精品激情| 欧美 日韩 国产精品免费观看| 久久精彩视频| 天堂综合在线播放| 91黄色8090| 98在线视频| 亚洲国产高清福利视频| 中文字幕永久在线| 一区二区三区不卡视频在线观看| aa一级黄色片| 国产一区二区三区黄视频| 国产黄页在线观看| 天天做综合网| 免费观看成人高| 日韩欧美激情电影| 国产精品久久久久久网站| 欧美黑人xx片| 一区二区在线视频| 天天干天天做天天操| 6080亚洲精品一区二区| 免费看日批视频| 亚洲综合网站在线观看| 手机看片日韩av| 粉嫩绯色av一区二区在线观看| 亚洲77777| 亚洲深夜av| 久久久天堂国产精品| 成人高清av| 免费一区二区三区| 91九色鹿精品国产综合久久香蕉| 国产人妖伪娘一区91| 日韩av影片| 久久久久久亚洲精品不卡| 日本在线免费| 国产一区二区三区在线视频| 婷婷在线观看视频| 欧美一区二区日韩| 亚洲网站免费观看| 色哟哟一区二区在线观看 | 色欧美片视频在线观看在线视频| 久久精品国产亚洲AV无码男同| 综合激情成人伊人| 五月激情四射婷婷| 国产午夜亚洲精品羞羞网站| 在线视频 日韩| 丁香桃色午夜亚洲一区二区三区| 色噜噜狠狠一区二区| 日韩综合在线视频| 免费在线观看的av网站| 一区二区三区四区五区精品视频| 日本一区二区三区四区五区六区| 成人情趣视频网站| 欧美在线一二三区| 亚洲色图丝袜| 欧美日韩高清在线一区| 伊人久久综合影院| 免费99视频| 免费久久久久久久久| 欧美国产视频在线观看| 欧美一区二区三区红桃小说| 精品免费二区三区三区高中清不卡 | 亚洲高清久久久| 久久机热这里只有精品| 一区二区在线免费| 欧美xxxx黑人xyx性爽| 亚洲精品午夜久久久| 精品国产乱码久久久久久鸭王1| 亚洲男帅同性gay1069| 免费在线黄色网| 一区二区三区在线视频观看58| 免费在线一区二区三区| 一区二区欧美精品| 日韩欧美激情视频| 色综合天天综合网国产成人综合天 | 大又大又粗又硬又爽少妇毛片 | 久草视频免费在线| 亚洲一区二区三区四区的| 久久9999久久免费精品国产| 午夜激情久久久| 亚洲欧美另类在线视频| 欧美日韩卡一卡二| 国产伦精品一区二区三区四区| 在线播放亚洲一区| 亚洲av无码一区二区三区dv| 亚洲第一级黄色片| 免费在线一级视频| 亚洲人成免费电影| 91视频在线观看| 欧美插天视频在线播放| 91高清视频在线观看| 91精品国产91久久久久久吃药 | 6080yy午夜一二三区久久| a天堂中文在线观看| 精品电影一区二区| 免费黄色在线视频网站| www.国产精品一二区| 美女网站视频在线| 日韩免费在线视频| 伊人久久大香伊蕉在人线观看热v| 国产高清自拍一区| 久久综合色占| 黄色录像特级片| 国产一区导航| av免费一区二区| 99精品视频一区| 成年人网站在线观看视频| 亚洲国产成人精品视频| 久久久国产免费| 日韩欧美一区二区三区在线| 日本一区高清| 久久艳片www.17c.com| 色吧亚洲日本| 亚洲一区二区三区香蕉| 久久av电影| 国产精品va在线观看无码| 日韩高清一区在线| 国产综合内射日韩久| 欧美国产日韩亚洲一区| 亚洲黄色一区二区| 欧美二区三区91| 精品亚洲综合| 午夜免费久久久久| 国产一区二区久久久久| 五月天色一区| 99av国产精品欲麻豆| 欧美性受xxxx黒人xyx性爽| 久久久久久一级片| 国产在线观看成人| 在线播放国产精品二区一二区四区| 毛片在线能看| 午夜精品福利视频| 日韩精品久久久久久久软件91| 亚洲bbw性色大片| 国产一区二区三区成人欧美日韩在线观看 | 欧美成人video| 日本免费在线视频| 国产精品大陆在线观看| 香蕉人人精品| 青草青青在线视频| 日韩精品欧美| 亚洲社区在线观看| jizz亚洲| 日韩av色在线| 日韩美女精品| 人人妻人人澡人人爽欧美一区| 全部av―极品视觉盛宴亚洲| 一本加勒比波多野结衣| 一区二区三区国产精品| 国产精品区在线观看| 国产一区二区三区18| 亚洲天堂手机| 久久精品日产第一区二区三区 | 日韩人妻精品无码一区二区三区| 国产大陆精品国产| 黄色片在线观看网站| 欧美精品久久久久久久多人混战| www.视频在线.com| 国产精品久久久| av在线不卡免费观看| 天天碰免费视频| 欧美国产综合色视频| 亚洲图片欧美日韩| 一本一本久久a久久精品综合小说| 范冰冰一级做a爰片久久毛片| 精品欧美国产一区二区三区不卡| 在线免费高清一区二区三区| 国产高潮失禁喷水爽到抽搐| 亚洲一区日韩精品中文字幕| 亚洲第一精品网站| 国内精品久久久| 国产人妖ts一区二区| 成人性免费视频| 91碰在线视频| 性高潮视频在线观看| 中文字幕综合一区| 高清久久精品| 18禁裸男晨勃露j毛免费观看 | 国产中文一区二区| 亚洲日本久久| 成年人网站免费在线观看| 日本高清视频一区二区| www日韩tube| 亚洲一区二区中文| 国户精品久久久久久久久久久不卡| 中文字幕一区二区三区人妻在线视频| 亚洲sss视频在线视频| 九色在线免费| 成人免费视频网址| 国产一区欧美| 免费在线一区观看| 国产 日韩 欧美在线| 99v久久综合狠狠综合久久| 亚洲av中文无码乱人伦在线视色| 亚洲超丰满肉感bbw| 一区二区三区久久久久| 在线看国产一区| 日本中文字幕电影在线免费观看 | 亚洲国产视频二区| av黄色在线网站| 国产精品色一区二区三区| 国产免费一区二区三区最新不卡| 久久久噜噜噜久久| 国产综合久久久| 91福利视频免费观看| 欧美性猛交xxxx偷拍洗澡| 欧美成人精品一区二区男人看| 成人h视频在线观看| 久久午夜视频| 神马午夜精品91| 亚洲女人被黑人巨大进入| 成人噜噜噜噜| 国产精品亚洲αv天堂无码| 中文字幕在线观看一区| 欧美 日韩 国产 成人 在线 91 | 成人av激情人伦小说| 情侣黄网站免费看| 亚洲黄色小视频| 国产区在线视频| 国产成人成网站在线播放青青| 日日骚欧美日韩| 久久精品人妻一区二区三区| 中文字幕日韩av电影| 日韩美脚连裤袜丝袜在线|