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

詳解iOS開發之將XML轉換成樹 上篇

移動開發 iOS
iOS開發本文章將封裝一個簡單操作XML轉換成樹的類方便自己操作:首先通過NSXMLParser從服務端獲取XML,它可以一邊下載,一邊解析,然后轉換成樹形結構,最后我們可以從樹形結構中去取值。

iOS開發之將XML轉換成是本文要介紹的內容,開發中由于服務端與客戶端是兩種不同的平臺,而且服務端又是老系統,不具備很好的面向對象的性質,所以導致客戶端與服務端只好通過一些制定好的xml進行通信。

iOS中對XML的解析不像donet這么方便。當然也存在一些很方便的開源類庫去調用,但是有些開源的類庫顯得很笨重。本文章將封裝一個簡單操作XML轉換成的類方便自己操作:首先通過NSXMLParser從服務端獲取XML,它可以一邊下載,一邊解析,然后轉換成形結構,最后我們可以從形結構中去取值。

使用NSXMLParser解析XML:

NSXMLParser中主要有三個委托方法來解析XML:

1、parser:didStartElement: 當解析器對象遇到xml的開始標記時,調用這個方法。

2、parser:didEndElement:當解析器對象遇到xml的結束標記時,調用這個方法。

3、parser:foundCharacters:當解析器找到開始標記和結束標記之間的字符時,調用這個方法。

了解了NSXMLParser機制。然后我們來封裝解析XML的類:XMLParser。

 

  1. #import <CoreFoundation/CoreFoundation.h>    
  2. #import "TreeNode.h"    
  3. @interface XMLParser : NSObject   
  4. {    
  5.     NSMutableArray      *stack;    
  6. }    
  7. + (XMLParser *) sharedInstance;    
  8. - (TreeNode *) parseXMLFromURL: (NSURL *) url;    
  9. - (TreeNode *) parseXMLFromData: (NSData*) data;    
  10. @end  

shareInstance使用一個單例。

調用parseXMLFromURL方法,需要一個NSURL的參數,返回我們需要的樹節點。

調用parseXMLFromData方法,需要一個NSData的參數,返回我們需要的樹節點。

在此之前,先定義TreeNode類:

  1. #import <CoreFoundation/CoreFoundation.h>    
  2. @interface TreeNode : NSObject   
  3. {    
  4.     TreeNode        *parent;    
  5.     NSMutableArray  *children;    
  6.     NSString        *key;    
  7.     NSString        *leafvalue;    
  8. }    
  9. @property (nonatomic, retain)   TreeNode        *parent;    
  10. @property (nonatomic, retain)   NSMutableArray  *children;    
  11. @property (nonatomic, retain)   NSString        *key;    
  12. @property (nonatomic, retain)   NSString        *leafvalue;    
  13. @property (nonatomic, readonly) BOOL            isLeaf;    
  14. @property (nonatomic, readonly) BOOL            hasLeafValue;    
  15. @property (nonatomic, readonly) NSArray         *keys;    
  16. @property (nonatomic, readonly) NSArray         *allKeys;    
  17. @property (nonatomic, readonly) NSArray         *uniqKeys;    
  18. @property (nonatomic, readonly) NSArray         *uniqAllKeys;    
  19. @property (nonatomic, readonly) NSArray         *leaves;    
  20. @property (nonatomic, readonly) NSArray         *allLeaves;    
  21. @property (nonatomic, readonly) NSString        *dump;    
  22. + (TreeNode *) treeNode;    
  23. - (NSString *) dump;    
  24. - (void) teardown;    
  25. // Leaf Utils    
  26. - (BOOL) isLeaf;    
  27. - (BOOL) hasLeafValue;    
  28. - (NSArray *) leaves;    
  29. - (NSArray *) allLeaves;    
  30. // Key Utils    
  31. - (NSArray *) keys;     
  32. - (NSArray *) allKeys;     
  33. - (NSArray *) uniqKeys;    
  34. - (NSArray *) uniqAllKeys;    
  35. // Search Utils    
  36. - (TreeNode *) objectForKey: (NSString *) aKey;    
  37. - (NSString *) leafForKey: (NSString *) aKey;    
  38. - (NSMutableArray *) objectsForKey: (NSString *) aKey;    
  39. - (NSMutableArray *) leavesForKey: (NSString *) aKey;    
  40. - (TreeNode *) objectForKeys: (NSArray *) keys;    
  41. - (NSString *) leafForKeys: (NSArray *) keys;    
  42.  
  43. // Convert Utils    
  44. - (NSMutableDictionary *) dictionaryForChildren;    
  45. @end  

TreeNode 實現:

  1. #import "TreeNode.h"    
  2. // String stripper utility macro    
  3. #define STRIP(X)    [X stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]     
  4. @implementation TreeNode    
  5. @synthesize parent;    
  6. @synthesize children;    
  7. @synthesize key;    
  8. @synthesize leafvalue;    
  9. #pragma mark Create and Initialize TreeNodes    
  10. - (TreeNode *) init    
  11. {    
  12.     if (self = [super init])     
  13.     {    
  14.         self.key = nil;    
  15.         self.leafvalue = nil;    
  16.         self.parent = nil;    
  17.         self.children = nil;    
  18.     }    
  19.     return self;    
  20. }    
  21. + (TreeNode *) treeNode    
  22. {    
  23.     return [[[self alloc] init] autorelease];    
  24. }    
  25. #pragma mark TreeNode type routines    
  26. - (BOOL) isLeaf    
  27. {    
  28.     return (self.children.count == 0);    
  29. }    
  30. - (BOOL) hasLeafValue    
  31. {    
  32.     return (self.leafvalue != nil);    
  33. }    
  34. #pragma mark TreeNode data recovery routines    
  35. // Return an array of child keys. No recursion    
  36. - (NSArray *) keys    
  37. {    
  38.     NSMutableArray *results = [NSMutableArray array];    
  39.     for (TreeNode *node in self.children) [results addObject:node.key];    
  40.     return results;    
  41. }    
  42. // Return an array of child keys with depth-first recursion.    
  43. - (NSArray *) allKeys    
  44. {    
  45.     NSMutableArray *results = [NSMutableArray array];    
  46.     for (TreeNode *node in self.children)     
  47.     {    
  48.         [results addObject:node.key];    
  49.         [results addObjectsFromArray:node.allKeys];    
  50.     }    
  51.     return results;    
  52. }    
  53. - (NSArray *) uniqArray: (NSArray *) anArray    
  54. {    
  55.     NSMutableArray *array = [NSMutableArray array];    
  56.     for (id object in [anArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)])    
  57.         if (![[array lastObject] isEqualToString:object]) [array addObject:object];    
  58.    return array;    
  59. }    
  60. // Return a sorted, uniq array of child keys. No recursion    
  61.  
  62. - (NSArray *) uniqKeys    
  63. {    
  64.     return [self uniqArray:[self keys]];    
  65. }    
  66. // Return a sorted, uniq array of child keys. With depth-first recursion    
  67.  
  68. - (NSArray *) uniqAllKeys    
  69. {    
  70.     return [self uniqArray:[self allKeys]];    
  71. }    
  72. // Return an array of child leaves. No recursion    
  73.  
  74. - (NSArray *) leaves    
  75. {    
  76.     NSMutableArray *results = [NSMutableArray array];    
  77.     for (TreeNode *node in self.children) if (node.leafvalue) [results addObject:node.leafvalue];    
  78.     return results;    
  79. }    
  80. // Return an array of child leaves with depth-first recursion.    
  81.  
  82. - (NSArray *) allLeaves    
  83. {    
  84.     NSMutableArray *results = [NSMutableArray array];    
  85.     for (TreeNode *node in self.children)     
  86.     {    
  87.         if (node.leafvalue) [results addObject:node.leafvalue];    
  88.         [results addObjectsFromArray:node.allLeaves];    
  89.     }    
  90.     return results;    
  91. }    
  92. #pragma mark TreeNode search and retrieve routines    
  93. // Return the first child that matches the key, searching recursively breadth first    
  94. - (TreeNode *) objectForKey: (NSString *) aKey    
  95. {    
  96.     TreeNode *result = nil;    
  97.     for (TreeNode *node in self.children)     
  98.         if ([node.key isEqualToString: aKey])    
  99.         {    
  100.            result = node;    
  101.             break;    
  102.         }    
  103.     if (result) return result;    
  104.     for (TreeNode *node in self.children)    
  105.     {    
  106.         result = [node objectForKey:aKey];    
  107.         if (result) break;    
  108.     }    
  109.     return result;    
  110. }    
  111. // Return the first leaf whose key is a match, searching recursively breadth first    
  112.  
  113. - (NSString *) leafForKey: (NSString *) aKey    
  114. {    
  115.     TreeNode *node = [self objectForKey:aKey];    
  116.     return node.leafvalue;    
  117. }    
  118. // Return all children that match the key, including recursive depth first search.    
  119.  
  120. - (NSMutableArray *) objectsForKey: (NSString *) aKey    
  121. {    
  122.     NSMutableArray *result = [NSMutableArray array];    
  123.     for (TreeNode *node in self.children)     
  124.     {    
  125.         if ([node.key isEqualToString: aKey]) [result addObject:node];    
  126.         [result addObjectsFromArray:[node objectsForKey:aKey]];    
  127.     }    
  128.     return result;    
  129. }    
  130. // Return all leaves that match the key, including recursive depth first search.    
  131.  
  132. - (NSMutableArray *) leavesForKey: (NSString *) aKey    
  133. {    
  134.     NSMutableArray *result = [NSMutableArray array];    
  135.     for (TreeNode *node in [self objectsForKey:aKey])     
  136.         if (node.leafvalue)    
  137.             [result addObject:node.leafvalue];    
  138.     return result;    
  139. }    
  140. // Follow a key path that matches each first found branch, returning object    
  141.  
  142. - (TreeNode *) objectForKeys: (NSArray *) keys    
  143.  
  144. {    
  145.     if ([keys count] == 0) return self;    
  146.     NSMutableArray *nextArray = [NSMutableArray arrayWithArray:keys];    
  147.     [nextArray removeObjectAtIndex:0];    
  148.     for (TreeNode *node in self.children)    
  149.     {    
  150.         if ([node.key isEqualToString:[keys objectAtIndex:0]])    
  151.             return [node objectForKeys:nextArray];    
  152.     }    
  153.     return nil;    
  154. }    
  155. // Follow a key path that matches each first found branch, returning leaf    
  156.  
  157. - (NSString *) leafForKeys: (NSArray *) keys    
  158. {    
  159.     TreeNode *node = [self objectForKeys:keys];    
  160.    return node.leafvalue;    
  161. }    
  162. #pragma mark output utilities    
  163. // Print out the tree    
  164.  
  165. - (void) dumpAtIndent: (int) indent into:(NSMutableString *) outstring    
  166. {    
  167.     for (int i = 0; i < indent; i++) [outstring appendString:@"--"];    
  168.     [outstring appendFormat:@"[%2d] Key: %@ ", indent, key];    
  169.     if (self.leafvalue) [outstring appendFormat:@"(%@)", STRIP(self.leafvalue)];    
  170.     [outstring appendString:@"\n"];    
  171.     for (TreeNode *node in self.children) [node dumpAtIndent:indent + 1 into: outstring];    
  172. }    
  173. - (NSString *) dump    
  174. {    
  175.     NSMutableString *outstring = [[NSMutableString alloc] init];    
  176.     [self dumpAtIndent:0 into:outstring];    
  177.     return [outstring autorelease];    
  178. }    
  179. #pragma mark conversion utilities    
  180. // When you're sure you're the parent of all leaves, transform to a dictionary    
  181.  
  182. - (NSMutableDictionary *) dictionaryForChildren    
  183. {    
  184.     NSMutableDictionary *results = [NSMutableDictionary dictionary];    
  185.     for (TreeNode *node in self.children)    
  186.         if (node.hasLeafValue) [results setObject:node.leafvalue forKey:node.key];    
  187.     return results;    
  188. }    
  189. #pragma mark invocation forwarding    
  190. // Invocation Forwarding lets node act like array    
  191.  
  192. - (id)forwardingTargetForSelector:(SEL)sel     
  193. {     
  194.     if ([self.children respondsToSelector:sel]) return self.children;     
  195.     eturn nil;    
  196. }    
  197. // Extend selector compliance    
  198. - (BOOL)respondsToSelector:(SEL)aSelector    
  199.  
  200. {    
  201.     if ( [super respondsToSelector:aSelector] ) return YES;    
  202.     if ([self.children respondsToSelector:aSelector]) return YES;    
  203.     return NO;    
  204. }    
  205. // Allow posing as NSArray class for children    
  206. - (BOOL)isKindOfClass:(Class)aClass    
  207.  
  208. {    
  209.     if (aClass == [TreeNode class]) return YES;    
  210.     if ([super isKindOfClass:aClass]) return YES;    
  211.     if ([self.children isKindOfClass:aClass]) return YES;    
  212.     return NO;    
  213. }    
  214. #pragma mark cleanup    
  215.  
  216. - (void) teardown    
  217. {    
  218.     for (TreeNode *node in [[self.children copy] autorelease]) [node teardown];    
  219.     [self.parent.children removeObject:self];    
  220.     self.parent = nil;    
  221. }    
  222.  
  223. - (void) dealloc    
  224. {    
  225.     self.parent = nil;    
  226.     self.children = nil;    
  227.     self.key = nil;    
  228.     self.leafvalue = nil;    
  229.    [super dealloc];    
  230. }    
  231. @end 

#p#

從上面的代碼可以看出,定義了很多方便的方法來獲取數據。

1、teardown:清除所有節點

2、isLeaf:判斷是否是葉子節點

3、hasLeafValue:判斷節點是否有值

4、- (NSArray *) leaves:返回節點的所有一級子節點值

5、- (NSArray *) allLeaves:返回節點的所有子節點的值

6、keys; 返回節點所有一級子節點名稱。

7、 allKeys; 返回節點所有子節點名稱。

8、 uniqKeys;返回節點一級子節點名稱,不重復。

9、uniqAllKeys;返回節點子節點名稱,不重復。

10、- (TreeNode *) objectForKey:根據節點名稱查詢節點

11、- (NSString *) leafForKey: (NSString *) aKey:根據節點名稱查詢出節點的值

12、- (NSMutableArray *) objectsForKey: (NSString *) aKey;根據節點名稱查詢出所以滿足條件的節點

13、- (NSMutableArray *) leavesForKey: (NSString *) aKey;根據節點名稱查詢出所以滿足條件的節點的值

14、- (TreeNode *) objectForKeys: (NSArray *) keys;:根據節點名稱路徑查詢出第一個滿足條件的節點。

15、- (NSString *) leafForKeys: (NSArray *) keys 根據節點名稱路徑查詢出第一個滿足條件的節點的值。

16、- (NSMutableDictionary *) dictionaryForChildren:將轉換成dictionary定義好了,下面實現XMLParser類:

  1. #import "XMLParser.h"    
  2. @implementation XMLParser    
  3. static XMLParser *sharedInstance = nil;    
  4. // Use just one parser instance at any time    
  5. +(XMLParser *) sharedInstance     
  6. {    
  7.     if(!sharedInstance) {    
  8.         sharedInstance = [[self alloc] init];    
  9.     }    
  10.     return sharedInstance;    
  11. }    
  12. // Parser returns the tree root. You may have to go down one node to the real results    
  13. - (TreeNode *) parse: (NSXMLParser *) parser    
  14. {    
  15.    stack = [NSMutableArray array];    
  16.     TreeNode *root = [TreeNode treeNode];    
  17.     root.parent = nil;    
  18.     root.leafvalue = nil;    
  19.     root.children = [NSMutableArray array];    
  20.     [stack addObject:root];    
  21.     [parser setDelegate:self];    
  22.     [parser parse];    
  23.     [parser release];    
  24.     // pop down to real root    
  25.     TreeNode *realroot = [[root children] lastObject];    
  26.     root.children = nil;    
  27.     root.parent = nil;    
  28.     root.leafvalue = nil;    
  29.     root.key = nil;    
  30.     realroot.parent = nil;    
  31.     return realroot;    
  32. }    
  33.  
  34. - (TreeNode *)parseXMLFromURL: (NSURL *) url    
  35. {       
  36.     TreeNode *results;    
  37.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];    
  38.     NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];    
  39.     results = [self parse:parser];    
  40.     [pool drain];    
  41.     return results;    
  42. }    
  43. - (TreeNode *)parseXMLFromData: (NSData *) data    
  44. {       
  45.     TreeNode *results;    
  46.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];    
  47.     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];    
  48.     results = [self parse:parser];    
  49.     [pool drain];    
  50.     return results;    
  51. }    
  52. // Descend to a new element    
  53.  
  54. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)
  55. namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict    
  56. {    
  57.     if (qName) elementName = qName;    
  58.     TreeNode *leaf = [TreeNode treeNode];    
  59.     leaf.parent = [stack lastObject];    
  60.     [(NSMutableArray *)[[stack lastObject] children] addObject:leaf];    
  61.     leaf.key = [NSString stringWithString:elementName];    
  62.     leaf.leafvalue = nil;    
  63.     leaf.children = [NSMutableArray array];    
  64.     [stack addObject:leaf];    
  65. }    
  66. // Pop after finishing element    
  67.  
  68. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName    
  69. {    
  70.     [stack removeLastObject];    
  71. }    
  72. // Reached a leaf    
  73.  
  74. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string    
  75. {    
  76.     if (![[stack lastObject] leafvalue])    
  77.     {    
  78.         [[stack lastObject] setLeafvalue:[NSString stringWithString:string]];    
  79.         return;    
  80.     }    
  81.     [[stack lastObject] setLeafvalue:[NSString stringWithFormat:@"%@%@", [[stack lastObject] leafvalue], string]];    
  82. }    
  83. @end  

使用這兩個類:

下面看下我們如何使用這個類:

在iis中放下面這個xml:

  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <Login>    
  3. <LoginResult>True</LoginResult>    
  4. <LoginInfo>恭喜你登錄成功</LoginInfo>    
  5. <LastLogin>2011-05-09 12:20</LastLogin>    
  6. <Right>    
  7. <A>1</A>    
  8. <B>1</B>    
  9. <C>0</C>    
  10. </Right>   
  11. </Login>  

使用下面代碼獲取web服務器上的xml,并將xml轉換成樹:

  1. NSURL * url = [[NSURL alloc] initWithString:@"http://10.5.23.117:4444/Login.xml"];    
  2.   TreeNode *node = [parser parseXMLFromURL:url];  

獲取xml中的登錄結果:

  1. view sourceprint?NSString * result =  [node leafForKey:@"LoginResult"];  

類似xpath去取值:

  1. NSArray *path =[[NSArray alloc]initWithObjects:@"Right",@"A",nil];      
  2. NSString * result =  [node leafForKeys:path];   

將xml顯示在tableview上:

 

 

  1. @implementation TreeBrowserController    
  2. @synthesize root;    
  3. // Each instance of this controller has a separate root, as    
  4. // descending through the tree produces new roots.    
  5.  
  6. - (id) initWithRoot:(TreeNode *) newRoot    
  7. {    
  8.     if (self = [super init])    
  9.     {    
  10.         self.root = newRoot;    
  11.         NSString *s =[newRoot dump];    
  12.         if (newRoot.key) self.title = newRoot.key;    
  13.     }    
  14.     return self;    
  15. }    
  16. - (id)initWithStyle:(UITableViewStyle)style    
  17. {    
  18.     self = [super initWithStyle:style];    
  19.     if (self) {    
  20.         // Custom initialization    
  21.     }    
  22.     return self;    
  23. }  
  1. // The number of rows equals the number of children for a node    
  2.  
  3. - (NSInteger)tableView:(UITableView *)tableView    
  4.  numberOfRowsInSection:(NSInteger)section    
  5. {    
  6.     return [self.root.children count];    
  7. }    
  8. // Color code the cells that can be navigated through    
  9.  
  10. - (UITableViewCell *)tableView:(UITableView *)tableView    
  11.         cellForRowAtIndexPath:(NSIndexPath *)indexPath    
  12. {    
  13.     UITableViewCell *cell = [tableView                      dequeueReusableCellWithIdentifier:@"generic"];    
  14.     if (!cell) cell = [[[UITableViewCell alloc]    
  15.                         initWithFrame:CGRectZero reuseIdentifier:@"generic"]    
  16.                        autorelease];    
  17.     TreeNode *child = [[self.root children]    
  18.                        objectAtIndex:[indexPath row]];    
  19.     // Set text    
  20.     if (child.hasLeafValue)    
  21.         cell.textLabel.text = [NSString stringWithFormat:@"%@:%@",    
  22.                                child.key, child.leafvalue];    
  23.     else  
  24.         cell.textLabel.text = child.key;    
  25.     // Set color    
  26.     if (child.isLeaf)    
  27.         cell.textLabel.textColor = [UIColor darkGrayColor];    
  28.     else   
  29.         cell.textLabel.textColor = [UIColor blackColor];    
  30.     return cell;    
  31. }    
  32. // On selection, either push a new controller or show the leaf value    
  33.  
  34. - (void)tableView:(UITableView *)tableView    
  35. didSelectRowAtIndexPath:(NSIndexPath *)indexPath    
  36.  
  37. {    
  38.     TreeNode *child =    
  39.     [self.root.children objectAtIndex:[indexPath row]];    
  40.     if (child.isLeaf)    
  41.     {            
  42.         return;    
  43.     }    
  44.     TreeBrowserController *tbc = [[[TreeBrowserController alloc]    
  45.                                   initWithRoot:child] autorelease];    
  46.     [self.navigationController pushViewController:tbc animated:YES];    
  47. }    
  48. // These controllers are ephemeral and need dealloc    
  49.  
  50. - (void) dealloc    
  51. {    
  52.     self.root = nil;    
  53.     [super dealloc];    
  54. }   
  55. @end  

效果:

詳解iOS開發之將XML轉換成樹 

詳解iOS開發之將XML轉換成樹

總結:詳解iOS開發之將XML轉換成的內容介紹完了,本文通過封裝兩個類庫,可以從web上很高效獲取xml,將xml轉換成形結構,可以很方便的對進行操作。那么希望本文對你有所幫助!請繼續閱讀詳解iOS開發之將XML轉換成樹 下篇

責任編輯:zhaolei 來源: 博客園
相關推薦

2011-08-02 10:08:32

IOS開發 XML

2011-02-25 10:22:03

ibmdwXMLDB2

2011-12-09 21:13:29

iOS

2021-08-31 09:12:18

StringIntLong

2021-06-07 17:30:23

LinuxASCII圖片轉換

2021-07-14 14:50:08

LinuxASCII圖片

2023-12-11 09:00:00

人工智能3D模型

2019-09-06 08:00:00

開源技術 語音

2023-10-20 08:00:00

人工智能MusicGen

2023-11-09 09:00:00

OpenAI人工智能Whisper

2011-08-02 11:07:42

iOS開發 UIWebView

2018-06-22 10:05:04

Arch LinuxDEB軟件包

2025-08-25 09:15:12

2021-04-02 08:13:22

5G網絡物聯網電網

2021-03-15 08:00:00

音頻框架數據

2022-07-19 10:53:57

模型算法智能

2010-03-23 10:29:28

Python程序編譯轉

2009-10-26 10:08:44

VB.NET工程轉換成

2020-05-29 09:34:28

httphttps網絡協議

2022-10-12 09:55:14

xls文件xlsx文件
點贊
收藏

51CTO技術棧公眾號

国产丝袜美腿一区二区三区| 国产偷倩在线播放| 青娱乐精品视频在线| 亚洲色图35p| 国产无套粉嫩白浆内谢的出处| 国产永久免费高清在线观看视频| 欧美gvvideo网站| 99这里都是精品| 91超碰caoporn97人人| 久久久精品人妻无码专区| 欧美日韩大片| 亚洲色图一区二区| 精品国产乱码久久久久| 校园春色 亚洲| 久久男人av| 色欧美88888久久久久久影院| 亚洲成人一区二区三区| 成 人片 黄 色 大 片| 99在线精品免费视频九九视| 伊人伊人伊人久久| 香蕉视频网站入口| 青草在线视频| 国产午夜精品一区二区| 亚洲www在线观看| 日韩激情在线播放| 99精品综合| 精品亚洲国产成av人片传媒| 天堂av2020| 天天色天天射天天综合网| 91亚洲男人天堂| 91中文在线视频| 亚洲欧美一区二区三区在线观看 | 激情av综合| 在线观看免费一区| 97视频在线免费| 91在线品视觉盛宴免费| 94色蜜桃网一区二区三区| 国产一区私人高清影院| 婷婷激情五月网| 欧美激情91| 少妇激情综合网| 欧美 日本 国产| 8848成人影院| 在线播放国产精品二区一二区四区 | 好吊视频一区二区三区| 久久国产综合精品| 国产成人精品免费视频| 日韩精品无码一区二区| 欧美激情综合| 久久精品福利视频| 手机免费观看av| 国产91精品对白在线播放| 亚洲黄色在线看| 中文字幕人妻熟女在线| 国产精品白丝久久av网站| 欧美日韩亚洲一区二区| 日本精品久久久久久久久久| 黄色动漫在线| 国产精品夫妻自拍| 亚洲欧洲久久| √天堂资源地址在线官网| 国产女同互慰高潮91漫画| 欧美国产综合视频| 蜜桃视频在线观看视频| 久久综合色婷婷| 久久久一本精品99久久精品| 人妻无码中文字幕| 99免费精品视频| 久久精品国产精品青草色艺| 性感美女福利视频| www.在线成人| 久久99精品久久久水蜜桃| 男人天堂网在线视频| 懂色av一区二区夜夜嗨| 国产精品v欧美精品∨日韩| 91精品国产乱码久久久| 黄网站免费久久| 97人人干人人| 免费成人在线看| 91丨九色丨尤物| 日本婷婷久久久久久久久一区二区 | 日韩精品免费专区| 国产精品自拍偷拍| 国产伦理一区二区| 成人精品小蝌蚪| 欧美福利精品| h视频在线观看免费| 国产精品伦理一区二区| xxxxxx在线观看| 毛片大全在线观看| 黑人巨大精品欧美一区二区三区| 美女福利视频在线| 国产一区二区三区朝在线观看| 欧美色男人天堂| 在线免费观看av网| 欧美人体视频| 中文字幕欧美国内| 超碰在线国产97| 亚洲国产高清视频| 国产成人小视频在线观看| 在线观看国产黄| 国产成人aaaa| 青青草国产精品| 激情成人四房播| 亚洲第一激情av| 国产在线青青草| 丁香婷婷久久| 精品国产免费视频| 午夜在线观看一区| 欧美日本二区| 国产精品久久久久久久久男| www黄色在线观看| 国产日韩欧美精品电影三级在线| 色一情一乱一乱一区91| 中文在线免费二区三区| 69堂亚洲精品首页| 97伦伦午夜电影理伦片| 我不卡手机影院| 国产91精品久久久久久| 国产乱人乱偷精品视频a人人澡| 成人av在线影院| 在线观看日韩片| 男人的天堂免费在线视频| 欧美精品三级在线观看| 亚洲av片不卡无码久久| 午夜精品免费| 国产精品自产拍高潮在线观看| 欧美特级特黄aaaaaa在线看| 亚洲国产精品精华液2区45| a级免费在线观看| 久久久免费人体| 亚洲精品久久久久| 欧洲第一无人区观看| 日韩激情一二三区| 精品日本一区二区| 亚洲制服国产| 在线不卡中文字幕播放| 色哟哟精品观看| 亚洲激情在线| 国产日韩精品电影| 国产乱视频在线观看| 精品二区三区线观看| 欧美成人手机在线视频| 欧美最新另类人妖| 国产不卡在线观看| 熟妇人妻一区二区三区四区 | 久久99精品久久久久| 欧美日本韩国一区二区三区| 午夜影院在线播放| 亚洲高清久久久久久| 欧美人妻精品一区二区三区| 经典一区二区三区| 亚洲综合欧美日韩| 成人亚洲综合| 色yeye香蕉凹凸一区二区av| 久久亚洲精品石原莉奈| www激情久久| 免费在线观看亚洲视频| 久久综合偷偷噜噜噜色| 日韩视频免费在线| 一级特黄色大片| 国产精品亲子伦对白| 午夜在线观看av| 神马电影久久| 国产精品极品尤物在线观看| 岛国在线视频免费看| 欧美丝袜第三区| 18精品爽国产三级网站| 久久三级视频| 日本精品一区二区| 国产精品第一| 久久精品夜夜夜夜夜久久| 国产又黄又猛又爽| 亚洲免费三区一区二区| 在线观看中文av| 欧美色一级片| 久久精品国产一区二区三区日韩| 伊人久久综合一区二区| 一区二区三区高清国产| 国产99久久久| 中文字幕免费不卡在线| 加勒比av中文字幕| 欧美黄色一区二区| 精选一区二区三区四区五区| 不卡一二三区| 自拍偷拍亚洲欧美| 国产99视频在线| 亚洲成人av免费| 手机看片日韩av| 国产酒店精品激情| 一二三四视频社区在线| 欧美日韩国产二区| 午夜精品小视频| 午夜视频一区二区| 给我看免费高清在线观看| 日韩精品视频网| 亚洲高清乱码| 玖玖玖电影综合影院| 91精品国产高清久久久久久久久| 国产天堂在线| 日韩视频免费观看高清完整版在线观看| 欧美日韩中文视频| 国产欧美综合在线观看第十页| 久久婷婷中文字幕| 99国产精品视频免费观看一公开| 日韩欧美电影一区二区| 一区二区三区欧洲区| 欧美在线视频在线播放完整版免费观看| 九色网友自拍视频手机在线| 91精品国产欧美日韩| 欧美在线观看不卡| 中文字幕亚洲成人| av在线播放网址| 久久精品免费观看| 成人中文字幕在线播放| 久久高清免费| 精品乱码一区二区三区| 精品国产黄a∨片高清在线| 97在线看福利| 美女免费久久| 精品一区二区三区四区| 精品久久久中文字幕人妻| 91福利在线免费观看| 国产无遮挡又黄又爽在线观看| 欧美极品xxx| 国产a级黄色片| 久久99久久久久| 久久久久狠狠高潮亚洲精品| 一级毛片免费高清中文字幕久久网| 久久精品国产一区二区三区不卡| 91麻豆精品国产综合久久久| 国产精品99久久久久久人 | 国产情侣在线视频| 国产精品成人网| 亚洲第一成人网站| 不卡视频免费播放| 国产又粗又猛又爽又黄| 蜜臀久久99精品久久久画质超高清| 日本丰满少妇xxxx| 亚洲成人精选| 亚洲精品人成| 成人精品影视| 欧美日本亚洲| 香蕉久久精品日日躁夜夜躁| 久久大片网站| 久久人人爽人人爽人人片av不| 国产成人一区二区三区免费看| 欧美美女福利视频| 国产精品视频大全| 99亚洲伊人久久精品影院| 国产成人综合一区二区三区| 日韩深夜视频| 555www成人网| 好吊日av在线| 久久久久久久成人| 搞黄网站在线看| 久久久久亚洲精品国产| 免费在线观看av| 久久精品久久久久电影| 国产cdts系列另类在线观看| 亚洲免费精彩视频| 偷拍自拍在线| 亚洲另类激情图| 国产综合在线观看| 亚洲国产精品成人精品| 日韩一区免费视频| 亚洲黄色av网站| 人妻一区二区三区| 亚洲久久久久久久久久久| 你懂的在线播放| 国产一区二区三区三区在线观看 | 成人av网站在线观看免费| 粉嫩av懂色av蜜臀av分享| 国产喂奶挤奶一区二区三区| 中文字幕在线观看2018| 亚洲国产日产av| 欧美特级黄色片| 欧美一区二区免费| 色视频在线观看免费| 日日狠狠久久偷偷四色综合免费| 色婷婷视频在线观看| 日本高清不卡在线| 日本一区精品视频| 热re99久久精品国产99热| 欧美一区二区| 免费国产成人av| 国产盗摄女厕一区二区三区| 熟女少妇一区二区三区| 亚洲男帅同性gay1069| www.毛片.com| 欧美一级久久久久久久大片| 亚洲aⅴ乱码精品成人区| 日韩中文字幕久久| 成人美女黄网站| www.久久久| 91综合在线| 中文字幕乱码人妻综合二区三区| 国产精品1区二区.| 一级在线观看视频| 午夜久久久影院| 国产超碰人人模人人爽人人添| 亚洲人成亚洲人成在线观看| 国产丝袜在线观看视频| 91精品国产综合久久久久久蜜臀 | 久久久91精品国产| 一个人www视频在线免费观看| 91九色在线免费视频| 成人系列视频| 99精品免费在线观看| 国产成人亚洲综合a∨猫咪| 最新av电影网站| 欧美午夜寂寞影院| 九九在线视频| 91精品国产精品| 哺乳一区二区三区中文视频 | 在线播放中文一区| 高清国产福利在线观看| 26uuu日韩精品一区二区| 在线精品国产亚洲| 国产成人免费高清视频| 麻豆精品国产91久久久久久| av电影在线不卡| 欧美日韩午夜视频在线观看| 蜜桃视频污在线观看| 欧美高跟鞋交xxxxxhd| 久久91视频| 亚洲图片在线观看| 日本sm残虐另类| 国产精品无码无卡无需播放器| 一本色道久久综合亚洲91| 日韩美女一级视频| 欧美日韩高清免费| 99热在线成人| 国产wwwxx| 国产嫩草影院久久久久| 啦啦啦免费高清视频在线观看| 精品伦理精品一区| 任你弄在线视频免费观看| 95av在线视频| 欧美暴力喷水在线| 波多野结衣在线免费观看| 中文字幕字幕中文在线中不卡视频| 小泽玛利亚一区二区三区视频| 一区二区三区国产视频| 日本免费一区二区视频| 国产主播喷水一区二区| 欧美日韩一区二区三区视频播放| 一区二区传媒有限公司| av在线综合网| 日韩黄色精品视频| 日韩精品在线免费观看视频| 免费毛片b在线观看| 麻豆成人av| 日日夜夜精品免费视频| 1024在线看片| 欧美一区二区三区在线电影| 青草在线视频| 久久精品欧美| 日韩激情视频网站| 色欲一区二区三区精品a片| 欧美大胆一级视频| 天堂8中文在线最新版在线| 日韩av一级大片| 国内精品国产三级国产a久久| 九九热只有精品| 国产婷婷成人久久av免费高清| 免费观看成人性生生活片| 曰韩不卡视频| 高清shemale亚洲人妖| www.色国产| 久久天天躁狠狠躁夜夜av| 北条麻妃一区二区三区在线观看| 国产超级av在线| 国产精品国产三级国产aⅴ无密码| www.亚洲欧美| 国产精品国产三级国产aⅴ9色| 51精产品一区一区三区| 中文字幕5566| 91精品国产一区二区三区蜜臀| 1区2区3区在线| 一区二区三区三区在线| 99久久777色| 91片黄在线观看喷潮| 久久久久久18| 日韩国产专区| 性囗交免费视频观看| 欧美日高清视频| 国产乱码午夜在线视频| 中国成人在线视频| 久久综合九色综合欧美亚洲| av一级黄色片| 国产精品99蜜臀久久不卡二区| 亚洲视频免费| 91视频在线网站| 日韩精品一区二区三区中文精品| 韩漫成人漫画| www.日本在线播放| 亚洲免费在线视频| 1024国产在线| 日本在线免费观看一区|