青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

cexer

cexer
posts - 12, comments - 334, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

寫了一個mircro XML解析器,附源代碼

Posted on 2008-08-22 16:56 cexer 閱讀(4496) 評論(20)  編輯 收藏 引用 所屬分類: utility

轉(zhuǎn)帖請注明出處 http://m.shnenglu.com/cexer/archive/2008/08/18/59285.html

不喜歡看人廢話喜歡直奔主題的是同學(xué)可以直接: goto 附件下載


  mirco 的意思是比 tiny 還要 tiny。

  GUI 模板用 XML 做是最合適的。方便嵌入腳本,方便編輯修改,方便嵌入皮膚描述,用 XML 做模板,寫起 GUI 編輯器也要方便得多。

  以前幾個的 GUI 模板解析器用的是 MSXML 來實現(xiàn)的,不過它提供的接口字符串類型全是 BSTR,自己的接口又是 TCHAR*,每一次的調(diào)用都會有一次字符串轉(zhuǎn)換,效率很低。而且一想到代碼里有 QueryInteface,AddRef,Release ,心里就不踏實,擔(dān)心吊膽的。

  于是又打算用 TinyXML,看了幾遍代碼,發(fā)現(xiàn)它對寬字符集的支持有些古怪。代碼里其它的雜七雜八的東西有點多,代碼風(fēng)格什么的也不大喜歡。

  于是自己寫了一個簡單的,雖然有錯誤檢測機制,不過沒有提供查詢接口,因為這樣我覺得使接口不整潔。其實要知道 XML 哪里出錯了很簡單,隨便拿個瀏覽器打開就行了,提示得非常詳細(xì)。不過以后可能會根據(jù)需要添加上。XPATH 支持也是如此。接口函數(shù)全部使用 UNICODE。

 

測試代碼:

   1: // cexer
   2: #include "./include/XML/xmlfile.h"
   3: #include "./include/XML/xmlelement.h"
   4: #include "./include/XML/xmldeclaration.h"
   5: #include "./include/XML/xmlunknown.h"
   6: #include "./include/XML/xmlcomment.h"
   7: #include "./include/XML/xmltext.h"
   8: #include "./include/XML/xmlattribute.h"
   9:  
  10: using namespace cexer;
  11: using namespace cexer::xml;
  12:  
  13:  
  14: // c++ std
  15: #include <iostream>
  16: using namespace std;
  17:  
  18:  
  19: int wmain( int argc,WCHAR** argv )
  20: {
  21:     wcout.imbue( std::locale("chs") );
  22:  
  23:     XmlFile document( L"./XMLs/utf16le_ns.xml" );
  24:     if ( !document.load() )
  25:     {
  26:         wcout<<L"解析失敗"<<endl;
  27:         return 0;
  28:     }
  29:  
  30:     XmlElement* root = document.element();
  31:     if ( !root )
  32:     {
  33:         wcout<<L"沒有找到根結(jié)點"<<endl;
  34:         return 0;
  35:     }
  36:  
  37:     wcout<<root->name()<<endl;
  38:  
  39:  
  40:     XmlNode* firstChild = root->firstChild();
  41:     if ( !firstChild )
  42:     {
  43:         wcout<<L"沒有子結(jié)點"<<endl;
  44:         return 0;
  45:     }
  46:  
  47:     XmlDeclaration* declar = xml_cast<XmlDeclaration*>( firstChild );
  48:     if ( !declar )
  49:     {
  50:         wcout<<L"第一個子結(jié)點不是聲明"<<endl;
  51:     }
  52:     else
  53:     {
  54:         wcout<<L"第一個節(jié)點是聲明"<<endl;
  55:         wcout<<L"version = "<<declar->version()<<endl;
  56:         wcout<<L"encoding = "<<declar->encoding()<<endl;
  57:         wcout<<L"standalone = "<<declar->standalone()<<endl;
  58:     }
  59:  
  60:     XmlComment* comment = xml_cast<XmlComment*>( firstChild->next() );
  61:     if ( !comment )
  62:     {
  63:         wcout<<L"第二個子結(jié)點不是注釋"<<endl;
  64:     }
  65:     else
  66:     {
  67:         wcout<<L"第二個結(jié)點是注釋:"<<comment->value()<<endl;
  68:     }
  69:  
  70:     XmlElement* window = root->element( L"window" );
  71:     if ( !window )
  72:     {
  73:         wcout<<L"沒有找到window元素結(jié)點"<<endl;
  74:         return 0;
  75:     }
  76:     wcout<<window->attributeValue( L"text" )<<endl;
  77:  
  78:  
  79:     XmlElement* nextWindow = window->nextElement( L"window" );
  80:     if ( !nextWindow )
  81:     {
  82:         wcout<<L"沒有找到后面的window元素結(jié)點"<<endl;
  83:     }
  84:     else
  85:     {
  86:         wcout<<L"后面還有一個window元素結(jié)點 ";
  87:         wcout<<nextWindow->attributeValue(_T("name"))<<endl;
  88:     }
  89:  
  90:     XmlElement* panel = window->element( L"panel" );
  91:     if ( panel )
  92:     {
  93:         wcout<<panel->attributeValue( L"caption" )<<endl;
  94:     }
  95:  
  96:     window->setAttribute( L"styleAdd",L"WS_VISIBLE" );
  97:     window->setAttribute( L"styleRemove",L"\";<>=&\"" );
  98:  
  99:     if ( !document.save( L"./XMLs/modified/utf16le_ns.xml" ) )
 100:     {    
 101:         wcout<<L"保存失敗"<<endl;
 102:     }
 103:  
 104:     return 0;
 105: }

 

編碼支持:

  因為內(nèi)部使用 MultiBytesToWideChar 和 WideCharToMultiBytes 來實現(xiàn)字符集/編碼的操作,因此對字符集/編碼的支持很靈活,能夠支持以上兩個函數(shù)支持的所有編碼,只需簡單的修改即可添加新的支持。預(yù)置了幾種編碼支持:

  1. UTF-16LE(UNICODE)
  2. GBK
  3. BIG5
  4. GB2312
  5. UTF-7
  6. UTF-8

  對于沒有編碼聲明并且沒有文件頭簽名文件,都視為 UTF-8 編碼。以上的代碼當(dāng)中的 XML 文件就是一個沒有簽名,沒有聲明的 UTF-16LE 編碼的 XML 文件。

  TinyXML 內(nèi)部解析字符串全是以 char*  類型來解析,只支持多字節(jié)編碼如 UTF-8,ASCII,不支持 UNICODE 編碼。如對中文的支持就比較古怪,如果 XML 以 UTF-8 格式保存,則設(shè)置“值”的時候必須自己把字符串轉(zhuǎn)換為 UTF-8 再設(shè)置,而在取得值以后,則必須自己將它們從 UTF-8 轉(zhuǎn)換成 UNICODE 或 ASCII,否則就是亂碼。

  主要是 TinyXML 為了跨平臺,所以沒有像 MultiBytesToWideChar  和 WideCharToMultiBytes  這種函數(shù)的直接支持。不過如果是為了跨平臺,這兩個函數(shù)也可以考慮自己實現(xiàn)。

 

節(jié)點類型轉(zhuǎn)換:

  因為在內(nèi)存當(dāng)中,元素,注釋,文本,聲明等結(jié)點都是存儲為一個基類的指針,因此在使用的時候必須要有一個類型轉(zhuǎn)換的動作。也有一些 XML 解析器比較簡單,其中只有文檔,元素,屬性這三種結(jié)點,內(nèi)存當(dāng)中存的全部都是元素集合,元素當(dāng)中再存有屬性集合,用不著類型轉(zhuǎn)換,不過這種 XML 將 XML 讀入內(nèi)存再存入磁盤文件當(dāng)中時,會丟失掉 XML 文件原有的格式。

  TinyXML 在內(nèi)存當(dāng)中所有的結(jié)點(除屬性)都以基類 TiXmlNode 指針的形式存放 ,從一個 TiXmlNode* 進行類型轉(zhuǎn)的方法是這樣的:

  首先在基 TiXmlBase 聲明一組虛函數(shù)

   1: class TiXmlNode
   2: {
   3:     virtual TiXmlDocument*   ToDocument()    { return 0; }
   4:     virtual TiXmlElement*    ToElement()        { return 0; }
   5:     virtual TiXmlComment*    ToComment()     { return 0; }
   6:     virtual TiXmlUnknown*    ToUnknown()        { return 0; }
   7:     virtual TiXmlText*       ToText()        { return 0; }
   8:     virtual TiXmlDeclaration*    ToDeclaration() { return 0; }
   9: };

 
  然后在子類當(dāng)中各自重寫向自己類型轉(zhuǎn)換的那一個虛函數(shù)。如在 XmlElement 和 XmlComment 當(dāng)中:

   1: class XmlElement
   2: {
   3:     virtual TiXmlElement*    ToElement()        { return this; }
   4: };
   5:  
   6: class XmlComment
   7: {
   8:     virtual TiXmlComment*    ToComment()     { return this; }
   9: };


  這樣做很方便,不過如果要寫一個新的 XML 結(jié)點類型,就比較麻煩了,必須重新修改基類 TiXmlNode 的代碼,整個 XML 解析器的代碼都得重新編譯一遍。

  我則借用了 COM 的 Queryinterface 的方式。在基類 XmlCastable 當(dāng)中聲明了一個虛函數(shù) query,任意結(jié)點調(diào)用這個函數(shù),輸入一個類型,若該結(jié)點是這個類型,那么就輸出指針的值并返回 true,否則輸出 NULL 并返回 false。

   1: class XmlCastable
   2: {
   3:     virtual bool query( XmlType destType,void** ppvoid ) = 0;
   4: };
   5:  


  如在 XmlNamedNode  當(dāng)中:

   1: bool XmlNamedNode::query( XmlType type,void** pptr )
   2: {
   3:     if ( !pptr )
   4:     {
   5:         return false;
   6:     }
   7:  
   8:     *pptr = NULL;
   9:  
  10:     if ( XmlNamedNode::s_type == type )
  11:     {
  12:         *pptr = this;
  13:         return true;
  14:     }
  15:  
  16:     return false;
  17: }


  不過這樣使用起來會相當(dāng)?shù)芈闊?,所以寫了一個輔助函數(shù) xml_cast,可以對 XmlNode* 這樣調(diào)用:

   1: XmlNode* node = ...;
   2: XmlElement* element = xml_cast<XmlElement*>( node );
   3: XmlComment* comment = xml_cast<XmlComment*>( node );


類結(jié)構(gòu):

   1: // 給函數(shù) xml_cast 提供結(jié)點類型的轉(zhuǎn)換能力
   2: class XmlCastable
   3: {...};
   4:  
   5: // 除了屬性結(jié)點(XmlAttribute)外,所有結(jié)點類型的基礎(chǔ)
   6: class XmlNode:public XmlCastable
   7: {...};
   8:  
   9: // 含有子結(jié)點的結(jié)點如:元素(XmlElement),文檔(XmlDocument)
  10: class XmlParentNode:public XmlNode
  11: {...};
  12:  
  13: // 有名字的結(jié)點如:元素(XmlElement),屬性(XmlAttribute)
  14: class XmlNamedNode:public XmlCastable
  15: {...};
  16:  
  17: // 有值的結(jié)點如:屬性(XmlAttribute),文本(XmlText),注釋(XmlComment),未知(XmlUnknown)
  18: class XmlValueNode:public XmlCastable
  19: {...};
  20:  
  21:  
  22: // XML聲明 <?xml ..... ?>
  23: class XmlDeclaration:public XmlNode
  24: {...};
  25:  
  26:  
  27: // XML注釋結(jié)點<!-- ..... -->
  28: class XmlComment:public XmlNode
  29:                  ,public XmlValueNode
  30: {...};
  31:  
  32:  
  33: // XML文本結(jié)點 [文本] 及 <![CDATA[...]]>
  34: class XmlText:public XmlNode
  35:               ,public XmlValueNode
  36: {...};
  37:  
  38: // XML文檔結(jié)點
  39: class XmlDocument:public XmlParentNode
  40: {...};
  41:  
  42: // XML元素結(jié)點
  43: class XmlElement:public XmlParentNode
  44:                  ,public XmlNamedNode
  45: {...};
  46:  
  47: // XML元素屬性
  48: class XmlAttribute:public XmlNamedNode
  49:                    ,public XmlValueNode
  50: {...};
  51:  
  52: // 解析器暫不支持的XML結(jié)點如
  53: //    <!DOCTYPE PLAY SYSTEM 'play.dtd'>
  54: //    <!ELEMENT title (#PCDATA)>
  55: //    <!ELEMENT books (title,authors)>
  56: class XmlUnknown:public XmlNode
  57:                  ,public XmlValueNode
  58: {...};
  59:  
  60:  


附件下載:

  從 cexer 的庫當(dāng)中把 xml 解析器剝離出來放上來。希望大家也都積極踴躍地共享代碼。(注:還沒有怎么詳細(xì)測試,切不可用于重要的項目如國防工程火箭發(fā)射工程之類的,崩潰死機核彈爆炸什么的本人概不負(fù)責(zé)。。。。)

點擊下載

Feedback

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2008-08-22 17:55 by 陳梓瀚(vczh)
http://m.shnenglu.com/vczh/archive/2008/06/28/54871.html

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2008-08-22 18:00 by 陳梓瀚(vczh)
話說我的庫的接口完全是Utf-16字符串的,然后我有一個Mbcs字符串類,倆能互轉(zhuǎn)。所以用我的庫的人要么用Utf-16,要么在每一個參數(shù)和返回值那里都去轉(zhuǎn)。

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2008-08-22 18:01 by cexer
@陳梓瀚(vczh)
真是牛人,不過你的代碼風(fēng)格我不喜歡哈。

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2008-08-22 18:02 by cexer
@陳梓瀚(vczh)
話說我的庫的接口完全是Utf-16字符串的,然后我有一個Mbcs字符串類,倆能互轉(zhuǎn)。所以用我的庫的人要么用Utf-16,要么在每一個參數(shù)和返回值那里都去轉(zhuǎn)。

一樣的哈。

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2008-08-22 18:04 by 陳梓瀚(vczh)
我的庫一開始的目的是僅給我個人用的。后來發(fā)exe和screenshoot發(fā)多了,有一些憤青噴我說沒發(fā)代碼純屬炫耀,雖然對于這些人他們需要的是一個代碼的鏈接,而不是一份代碼。我就只好那么干了。因此風(fēng)格是我自己私底下用的那一套,這是歷史原因。

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2008-08-22 18:15 by 陳梓瀚(vczh)
話說dynamic_cast<>在失敗的時候也是返回0,你自己寫一個難道是為了效率?還是怕編譯器被關(guān)掉RTTI?還是其他的什么東西。

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2008-08-22 19:00 by cexer
@陳梓瀚(vczh)
效率問題。dynamic_cast<>的比較的效率和字符串比較差不多,因此。。。不過想換成使用dynamic_cast<>也容易,直接
#define xml_cast dynamic_cast
就行了。

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2008-08-22 20:33 by 空明流轉(zhuǎn)
@陳梓瀚(vczh)
你那個歷史問題還是解決得好,要不我用你代碼要替換vl真是替換的欲死欲活啊。

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2008-08-22 21:13 by cexer
@空明流轉(zhuǎn)
系統(tǒng)懷疑你灌水,亂棒打出!

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2008-08-22 21:38 by foxtail
就是阿,他搞個vl做什么,囧@空明流轉(zhuǎn)

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2008-08-23 00:58 by 陳梓瀚(vczh)
因為我要強調(diào)我是因為那些憤青才開源的

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2008-08-23 08:35 by 空明流轉(zhuǎn)
你只要這個代碼不賣錢,還是開源的好。
我拿去貼代碼還是方便許多。

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2008-08-23 08:38 by 空明流轉(zhuǎn)
話說文本解析本來就不那么快,不在乎dynamic_cast那點時間的。

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2008-08-23 11:43 by cexer
@空明流轉(zhuǎn)
節(jié)點的類型轉(zhuǎn)換都是在解析完成以后的啊。如果是在循環(huán)當(dāng)中用dynamic_cast,效率還是挺低的。

# re: 寫了一個mircro XML解析器,附源代碼[未登錄]  回復(fù)  更多評論   

2008-08-24 10:28 by Kevin Lynx
cppblog人才輩出,不敢說話了。
我是真的來灌水......

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2008-08-24 15:24 by 戴爾筆記本
 GUI 模板用 XML 做的確是最合適的。因為方便嵌入腳本,

# re: 寫了一個mircro XML解析器,附源代碼[未登錄]  回復(fù)  更多評論   

2008-08-25 10:09 by 陳梓瀚(vczh)
要是想寫腳本的話直接HTML好了。你要是為了界面而往C++里面加個腳本引擎,完全是得不償失。

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2008-08-25 11:28 by cexer
@陳梓瀚(vczh)
曾經(jīng)實現(xiàn)過類似HTML的,加了上腳本引擎,可配置能力和二次開發(fā)能力大大增強,用處還是很大的。

# re: 寫了一個mircro XML解析器,附源代碼[未登錄]  回復(fù)  更多評論   

2008-08-25 14:17 by 陳梓瀚(vczh)
嗯嗯,基于這一點考慮我做了vczh free script 2.0,而不是做一個script for GUI framework……

# re: 寫了一個mircro XML解析器,附源代碼  回復(fù)  更多評論   

2009-01-08 16:36 by 陳昕
報告?zhèn)€bug,保存成UTF16文件的時候頭部字節(jié)錯了,和讀取時的不一樣,并且IE打不開保存的文件.改成和讀取時的一樣就好了.
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久人人爽人人爽| 欧美成人午夜视频| 夜色激情一区二区| 欧美日韩伦理在线免费| 一个色综合导航| 99香蕉国产精品偷在线观看| 欧美日韩中文字幕在线视频| 一区二区三区色| 99热精品在线观看| 国产私拍一区| 免费久久99精品国产| 欧美激情第五页| 亚洲欧美高清| 久久精品视频免费| 亚洲国产一区二区视频| 99www免费人成精品| 国产日产欧产精品推荐色| 久久久久久久久久看片| 女女同性精品视频| 亚洲免费小视频| 久久先锋资源| 亚洲视频第一页| 欧美在线视频一区二区三区| 亚洲欧洲视频| 这里是久久伊人| 伊人成年综合电影网| 亚洲伦理自拍| 激情综合色综合久久| 亚洲美女网站| 韩国自拍一区| 一本色道婷婷久久欧美| 在线不卡中文字幕| 亚洲色无码播放| 亚洲黄色免费电影| 午夜精品免费在线| 一本久道综合久久精品| 久久久91精品国产一区二区三区| 99视频精品在线| 久久精品伊人| 亚洲伊人色欲综合网| 久久夜精品va视频免费观看| 亚洲欧美另类国产| 欧美精品日韩| 欧美成人亚洲| 国产曰批免费观看久久久| 亚洲裸体视频| 亚洲精品乱码久久久久久按摩观| 亚洲欧美视频在线观看视频| 亚洲裸体视频| 老色批av在线精品| 久久久久久免费| 国产精品一区二区视频| 亚洲精选视频免费看| 影音欧美亚洲| 久久成人18免费观看| 亚洲欧美视频在线观看| 欧美日韩视频免费播放| 亚洲国产综合91精品麻豆| 国产亚洲精品美女| 亚洲自拍偷拍一区| 午夜一区二区三区不卡视频| 欧美日韩免费在线视频| 亚洲人久久久| 一区二区三区高清| 欧美日韩精品久久| 亚洲日本电影在线| 日韩亚洲综合在线| 欧美日韩国产999| 亚洲精品色婷婷福利天堂| 亚洲日韩欧美视频一区| 欧美成人69| 亚洲日本va在线观看| 一本色道久久综合亚洲精品按摩 | 亚洲欧洲精品一区二区三区 | 国产一区二区三区免费观看| 亚洲一区综合| 久久国产精品第一页| 国产亚洲精品自拍| 久久精品人人做人人爽| 欧美成人日本| 99综合视频| 欧美天天在线| 欧美一区2区视频在线观看 | 中文精品99久久国产香蕉| 欧美日韩视频在线一区二区观看视频 | 国产精品成人一区二区网站软件 | 欧美高清视频一二三区| 亚洲国产精品久久精品怡红院| 亚洲欧洲日夜超级视频| 欧美日韩国产va另类| 亚洲图片你懂的| 久久久欧美一区二区| 影音先锋日韩精品| 欧美日本在线视频| 午夜精品久久久久久99热| 久久综合九九| 日韩亚洲欧美一区| 国产精品视频不卡| 久久在线观看视频| 一本不卡影院| 免费成人av在线看| 亚洲永久精品国产| 在线观看视频一区| 欧美日一区二区三区在线观看国产免| 亚洲欧美日韩综合一区| 欧美国产日本韩| 午夜天堂精品久久久久| 亚洲电影在线观看| 国产精品s色| 另类激情亚洲| 亚洲综合国产精品| 亚洲国产日日夜夜| 久久久www| 在线亚洲+欧美+日本专区| 国产亚洲欧美aaaa| 欧美色精品天天在线观看视频| 久久久久国产精品人| 一区二区免费在线视频| 欧美电影免费观看大全| 性高湖久久久久久久久| 夜夜爽www精品| 激情综合网激情| 国产精品一区在线播放| 欧美黄色视屏| 老司机午夜精品| 久久av资源网| 亚洲欧美日韩精品久久亚洲区| 亚洲日本黄色| 亚洲高清在线视频| 蜜月aⅴ免费一区二区三区 | 亚洲精品久久久久久久久久久| 国产亚洲一区精品| 国产精品v片在线观看不卡 | 久久久天天操| 欧美伊人精品成人久久综合97 | 久久精品女人的天堂av| 亚洲欧美在线观看| 亚洲一区二区三区免费观看| 亚洲精品欧美日韩| 亚洲日韩第九十九页| 亚洲黄色一区| 亚洲激情欧美| 亚洲国产精品福利| 亚洲成人在线网站| 一区二区在线观看视频| 激情综合自拍| 在线观看的日韩av| 亚洲高清免费视频| 亚洲国产一区二区三区高清| 亚洲国产精品久久久久秋霞蜜臀| 国产无遮挡一区二区三区毛片日本| 欧美色大人视频| 国产精品久久777777毛茸茸| 欧美日韩免费网站| 欧美亚洲第一页| 国产精品色婷婷| 国产欧美大片| 激情久久五月| 亚洲精品影院| 亚洲专区在线| 欧美在线啊v| 欧美91大片| 亚洲国产欧美国产综合一区| 亚洲人成人一区二区在线观看| 亚洲精品国产精品乱码不99按摩 | 性欧美暴力猛交另类hd| 久久精品一二三区| 欧美成人精品一区二区三区| 亚洲二区在线视频| 宅男噜噜噜66国产日韩在线观看| 亚洲一卡二卡三卡四卡五卡| 久久aⅴ国产欧美74aaa| 欧美www视频| 国产精品入口日韩视频大尺度| 国内揄拍国内精品久久 | 欧美日韩国产首页| 国产乱码精品1区2区3区| 激情视频一区| 在线视频一区二区| 久久久精品一区| 最新69国产成人精品视频免费| 一区二区三区免费在线观看| 久久爱www久久做| 欧美日韩成人激情| 激情久久久久久| 中日韩高清电影网| 猛男gaygay欧美视频| 99这里有精品| 久久综合色影院| 国产精品日韩欧美一区二区三区| 在线观看日韩专区| 午夜精品一区二区三区在线播放| 欧美91大片| 午夜精品久久久久久久99热浪潮 | 亚洲一本视频| 欧美激情国产日韩| 韩国美女久久| 亚洲欧美国产精品va在线观看| 欧美激情视频给我| 久久成人精品视频|