精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

人妻一区二区视频| 影音先锋成人资源网站| 中日韩精品视频在线观看| 精品国产一区二区三区不卡蜜臂| 伊人色综合久久天天| 亚洲自拍小视频免费观看| 性色av无码久久一区二区三区| 久久久久黄色| 丁香久久综合| 成人午夜视频免费看| 午夜免费在线观看精品视频| 丰满人妻一区二区三区免费视频棣 | 久久综合欧美| 欧美三级视频在线播放| 亚洲一区二区三区免费观看| 国产成人精品毛片| 欧美一区激情| 亚洲国产成人久久| 熟女人妇 成熟妇女系列视频| seseavlu视频在线| 国产精品资源网| 久久久视频免费观看| 色噜噜在线观看| 在线观看欧美日韩电影| 国产精品久久午夜夜伦鲁鲁| 国产91aaa| 800av免费在线观看| 日韩大片在线播放| 亚洲电影免费观看高清完整版在线观看| 免费无码不卡视频在线观看| 三级视频在线| 国产一区在线精品| 9.1国产丝袜在线观看| 亚洲色图 激情小说| 一区二区三区欧洲区| 日韩欧美亚洲国产一区| 日韩视频在线免费播放| 天堂在线视频免费观看| 老司机免费视频一区二区三区| 欧美成人国产va精品日本一级| 天天插天天射天天干| 欧美高清免费| 午夜av区久久| 免费看污污视频| 你懂得在线网址| 国产精品亚洲人在线观看| 浅井舞香一区二区| 国产精品美女毛片真酒店| 成人综合久久| 亚洲免费小视频| 69xxx免费视频| 激情中国色综合| 欧美午夜丰满在线18影院| 国产又粗又长又爽视频| 北岛玲一区二区三区| 99国产精品国产精品久久| 91美女片黄在线观| 中文字幕一区二区久久人妻| 亚洲国产午夜| 九九视频直播综合网| 秋霞网一区二区三区| 亚洲人成网www| 亚洲第一av网站| 在线观看免费的av| 日韩欧美一区二区三区免费观看 | 波多野结衣加勒比| 日韩精品中文字幕吗一区二区| 欧美二区在线观看| 在线成人精品视频| jizzjizzjizz欧美| 亚洲高清一二三区| 久久久久国产精品区片区无码| 欧美性生活一级片| 亚洲午夜精品久久久久久性色 | 99久久精品日本一区二区免费| 久久成人免费网| 成人黄色影片在线| 亚洲第一成年人网站| 成人av手机在线观看| 快播亚洲色图| av中文天堂在线| 亚洲乱码中文字幕综合| 青春草国产视频| 日韩伦理在线一区| 欧美亚洲国产一区二区三区| 午夜不卡福利视频| 丁香5月婷婷久久| 亚洲欧美视频在线| 欧美肥妇bbwbbw| 亚洲毛片播放| 国产精品日韩在线| www.av日韩| 99久久免费国产| 五月天丁香综合久久国产 | xxxx18国产| 99久久精品免费看国产| 日本一区二区高清视频| 黄色网址视频在线观看| 亚洲成va人在线观看| 日韩精品一区二区三区不卡| 在线观看亚洲精品福利片| 亚洲精品在线一区二区| 中文字幕av久久爽一区| 欧美日韩精品免费观看视频完整| 91爱爱小视频k| 在线观看黄色网| 成人综合在线视频| 亚洲人成人77777线观看| 蜜臀av在线| 欧美日韩mp4| 18禁裸乳无遮挡啪啪无码免费| 欧美残忍xxxx极端| 午夜精品一区二区三区在线播放| 怡红院男人天堂| 成人动漫av在线| 亚洲国产午夜伦理片大全在线观看网站| 午夜羞羞小视频在线观看| 日韩欧美精品在线观看| 逼特逼视频在线观看| 91综合网人人| 日韩美女av在线免费观看| www.国产三级| 亚洲欧美综合网| 国产精品免费观看久久| 亚洲天堂av资源在线观看| 国产一区二区免费| 亚洲黄色激情视频| 高清日韩电视剧大全免费| 亚洲一区在线免费| 日韩欧美另类一区二区| 亚洲第一精品夜夜躁人人躁| 麻豆明星ai换脸视频| 日韩vs国产vs欧美| 女人一区二区三区| 蜜桃视频m3u8在线观看| 日韩欧美www| 神马午夜精品91| 青青草成人在线观看| 你懂的网址一区二区三区| 123区在线| 精品乱码亚洲一区二区不卡| 顶级黑人搡bbw搡bbbb搡| 日韩成人一级片| 日本不卡二区高清三区| 中文字幕高清在线播放| 亚洲精品国产精品乱码不99按摩| 精品无码久久久久久久久| 国产精品一区二区在线看| 这里只有精品66| 成人在线免费电影网站| 中文字幕不卡在线视频极品| 日韩欧美一级大片| 久久精品在这里| 青青在线免费观看视频| 一区二区三区四区在线看| 91wwwcom在线观看| 韩国免费在线视频| 欧美在线一二三四区| 在线小视频你懂的| 麻豆免费看一区二区三区| 亚洲精品日韩精品| 99精品国产九九国产精品| 久久精品国产2020观看福利| 国产又黄又粗又猛又爽| 亚洲人成网站影音先锋播放| 手机在线观看日韩av| 午夜日韩视频| 久久艹中文字幕| 男人皇宫亚洲男人2020| 在线观看国产精品日韩av| 91成品人影院| 一区二区三区欧美视频| 91人人澡人人爽| 99热在线精品观看| 日本一区二区精品| 不卡一区视频| 久久久久久欧美| 青春草在线观看| 欧美日韩精品一二三区| 午夜国产福利一区二区| 成人av在线一区二区| 欧在线一二三四区| 综合久久精品| 国产一区福利视频| 成人黄色视屏网站| 欧美精品一本久久男人的天堂| 三级网站在线看| 日本久久一区二区| 日韩视频中文字幕在线观看| 波多野结衣91| 亚洲精品综合在线观看| 狠狠综合久久| 亚洲成人18| 一区中文字幕电影| 国产精品国产福利国产秒拍| 免费黄网站在线| 亚洲精品成人久久| 国产精品国产精品国产| 亚洲国产视频网站| 国产在线综合视频| 国产成人精品综合在线观看 | 天堂亚洲精品| 亚洲毛片在线观看| 国产福利免费视频| 91成人在线观看喷潮| 免费网站看av| 国产欧美日韩久久| 久久久老熟女一区二区三区91| 日本午夜精品一区二区三区电影| 麻豆传媒网站在线观看| 精品久久91| 国产精品乱码| 免费成人高清在线视频| 97不卡在线视频| 国产在线观看a| 国产亚洲欧美日韩精品| 内射后入在线观看一区| 欧美人与z0zoxxxx视频| 性色av免费观看| 亚洲国产精品久久久久秋霞影院| 国产传媒视频在线| 久久久亚洲精品一区二区三区| 97超碰免费在线观看| 麻豆精品一区二区| 欧美黄网站在线观看| 亚洲手机在线| 伊人久久在线观看| 日韩免费在线| 日本一区二区在线视频| 日韩母乳在线| 国产伦精品一区二区| 精品视频成人| 国产欧美日韩最新| 韩国精品视频在线观看| 日韩美女毛茸茸| 亚洲人体视频| 91精品国产一区| 9999热视频在线观看| 久久久久久久爱| 日本aa在线| 欧美第一页在线| 中文字幕有码在线观看| 久久影院中文字幕| 国产在线观看91| 久久综合久久美利坚合众国| 久久日韩视频| 久久中文字幕国产| 最新黄网在线观看| 欧美成人精品不卡视频在线观看| 黄色在线观看网站| 欧美刺激性大交免费视频| 黄色免费在线观看网站| 久久影院在线观看| 羞羞网站在线看| 欧美激情国产精品| 黄视频在线免费看| 午夜精品久久久久久久99黑人| 金瓶狂野欧美性猛交xxxx| 欧美激情在线观看| 黄色在线观看www| 欧美中文在线观看| 日本精品在线中文字幕| 国产精品夜间视频香蕉| 亚洲一区二区av| 亚洲精品免费网站| 中文字幕亚洲在线观看| 国产欧美丝袜| 久久av免费看| 一区二区三区四区在线视频| 我不卡伦不卡影院| 日本香蕉视频在线观看| 日韩午夜av| 狠狠操精品视频| 麻豆精品视频在线观看视频| 中文字幕第一页在线视频| 国产成人一级电影| 免费黄色三级网站| 日本一区二区综合亚洲| 黄色录像一级片| 亚洲午夜精品网| 国产精品suv一区| 欧美日韩免费视频| 亚洲伦理在线观看| 国产亚洲激情在线| 在线观看午夜av| 日本精品久久久| 亚洲成人高清| 国产日韩欧美一区二区| 欧洲美女日日| 男人的天堂avav| 日日摸夜夜添夜夜添精品视频| 亚洲最大天堂网| zzijzzij亚洲日本少妇熟睡| 天天干天天舔天天操| 亚洲制服丝袜在线| www.五月婷婷.com| 欧美成人精品福利| 国产精品免费观看| 欧美精品第一页在线播放| 色豆豆成人网| 粉嫩av免费一区二区三区| 成人影院在线| 无码av天堂一区二区三区| 日本美女一区二区| 污污内射在线观看一区二区少妇| 国产精品色婷婷久久58| 国模精品一区二区三区色天香| 国产av麻豆mag剧集| 麻豆精品蜜桃视频网站| 中文字幕免费高清视频| 中文字幕五月欧美| 五月天激情国产综合婷婷婷| 日韩一区二区三| 成人在线二区| 久久久免费观看视频| 青娱乐极品盛宴一区二区| 久久99精品久久久久久久久久| 91精品天堂福利在线观看 | 久久亚洲色图| 9.1在线观看免费| 综合色天天鬼久久鬼色| 免费无码国产精品| 日本激情在线观看| 亚洲一区二区欧美| 亚洲制服中文| 国产字幕视频一区二区| 视频二区在线播放| 久久综合九色综合欧美98| 久久久久久欧美精品se一二三四| 精品视频在线免费看| 你懂的在线视频| 91超碰caoporn97人人| 91九色鹿精品国产综合久久香蕉| 日韩精品国内| 久久激情网站| 久久久久成人精品无码中文字幕| 樱花影视一区二区| 国产乱淫a∨片免费观看| 日韩中文字幕国产| 国产在线|日韩| 秋霞毛片久久久久久久久| 性xx色xx综合久久久xx| jlzzjizz在线播放观看| 亚洲成av人片在线观看无码| 亚洲精品成av人片天堂无码| 欧美精品手机在线| 一本一道久久a久久| 成年人深夜视频| 国产成人久久精品77777最新版本| 手机在线免费看片| 日韩丝袜情趣美女图片| av在线免费观看网址| 7777精品伊久久久大香线蕉语言| 888久久久| wwwxxxx在线观看| 亚洲高清在线视频| 天天干天天草天天射| 欧美在线视频观看| 国产区精品区| 欧美精品久久久久久久久25p| 国产精品青草久久| 国产又大又长又粗| 欧美国产亚洲视频| 欧美日韩另类图片| 黄色a级片免费| 欧美国产欧美亚州国产日韩mv天天看完整| 天天射天天干天天| 色七七影院综合| 国产精品亚洲综合在线观看| 欧美美女黄色网| 成人午夜激情视频| 午夜婷婷在线观看| 亚洲色图欧美制服丝袜另类第一页| 外国电影一区二区| mm131午夜| 99视频国产精品| 黄色片视频免费| 日韩中文字幕av| 亚洲精品高潮| 国产欧美在线一区| 国产精品久久久久久久久晋中 | 99热这里只有成人精品国产| 亚洲 小说 欧美 激情 另类| 欧美日韩电影在线| yellow在线观看网址| 午夜免费电影一区在线观看| 国产精品12区| 69视频免费看| 欧美高清第一页| 国产一区网站| 青青草精品在线| 色琪琪一区二区三区亚洲区| 成人video亚洲精品| 高清国产一区| 日韩va亚洲va欧美va久久| 三级黄色录像视频| 亚洲精品资源在线| 久久久久亚洲精品中文字幕| 给我免费播放片在线观看| 久久综合网色—综合色88|