亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#中的Linq to Xml詳解

2020-01-24 02:09:35
字體:
來源:轉載
供稿:網友

前言

我相信很多從事.NET開發的,在.NET 3.5之前操作XML會比較麻煩,但是在此之后出現了Linq to Xml,而今天的主人公就是Linq to Xml,廢話不多說,直接進入主題。

一、生成Xml

為了能夠在結構有一定的組織,筆者建議大家新建一個控制臺項目,并且新建一個CreateXml類(以下部分都屬于該類中)。

并在其中寫入以下屬性:

復制代碼 代碼如下:

public static String Path
        {
            get
            {
                String path = String.Format("{0}//test.xml", Environment.CurrentDirectory);
                return path;
            }
        }

這句代碼很好理解,就是為了下面我們示例的時候可以將xml保存到當前程序的運行路徑下。

(以下的示例中不會包含Main方法中的寫法,因為Main中僅僅只要調用該靜態方法即可。)

1.創建簡單的Xml

首先我們先練練手,創建一個簡單的Xml并保存到一個文件中。

代碼如下:

復制代碼 代碼如下:

/// <summary>
/// 創建簡單的xml并保存
/// </summary>
public static void CreateElement()
{
XDocument xdoc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XElement("root",
new XElement("item", "1"),
new XElement("item", "2")
));
xdoc.Save(Path);
}

很多學習過XML的人可以從結構就能夠猜測出最終的xml的組織,而這也是linq to xml的優點之一。這句代碼首先創建一個xml文檔,并設置該xml的版本為1.0,

采用utf-8編碼,后面的yes表示該xml是獨立的。下面就開始創建每個節點的,首先是Root節點,然后在Root節點中添加兩個Item節點。

最終生成的Xml如下所示:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<root>
    <item>1</item>
    <item>2</item>
</root>

2.創建注釋

當xml有很多項時,我們就需要利用注釋加以區別,通過linq to xml我們一樣可以在其中添加注釋。

比如下面這段代碼:

復制代碼 代碼如下:

/// <summary>
        /// 創建注釋
        /// </summary>
        public static void CreateComment()
        {
            XDocument doc = new XDocument(
                new XDeclaration("1.0", "utf-8", "yes"),
                new XComment("提示"),
                new XElement("item", "asd")
                );
            doc.Save(Path);
        }

這里我們直接在版本信息的后面添加了一條注釋。

最終的結果如下所示:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--提示-->
<item>asd</item>

3.根據對象創建xml

很多時候我們都會將數組之類的類型轉換成xml以便保存進永久性存儲介質中,所以下面我們也簡單的舉了一個例子,將數組轉換成xml。

代碼如下所示:

復制代碼 代碼如下:

/// <summary>
        /// 根據對象創建xml并保存
        /// </summary>
        public static void CreateElementByObjects()
        {
            var s = Enumerable.Range(1, 10);
            XElement xele = new XElement(
                "Root",
                from item in s
                select new XElement("item", item.ToString())
                );
            xele.Save(Path);
        }

一開始的代碼 var s = Enumerable.Radge(1,10)是從1開始遞增,生成含有10項的數組,以便后面我們進行添加,有了這個數組之后,

我們通過簡單的linq語句將數組轉換成xml,添加到Root中。

保存之后的結果如下:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <item>1</item>
  <item>2</item>
  <item>3</item>
  <item>4</item>
  <item>5</item>
  <item>6</item>
  <item>7</item>
  <item>8</item>
  <item>9</item>
  <item>10</item>
</Root>

4.創建屬性

有時我們不想創建新的子項去保存數據,而是使用屬性的方式去保存。理所應當,linq to xml一樣也支持這個功能,下面我們可以通過簡單的語句去實現它。

代碼如下所示:

復制代碼 代碼如下:

/// <summary>
        /// 創建屬性
        /// </summary>
        public static void CreteAttribute()
        {
            XAttribute xa = new XAttribute("V2", "2");
            XElement xele = new XElement(
                "Root",
                new XElement("Item",
                    new XAttribute("V1", "1"),
                    xa
                    ));
            xele.Save(Path);
        }

我們依然可以看到熟悉的語法,這里我們利用了XAttribute去創建一個屬性,并添加到XElement中。

最終的結果如下:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Item V1="1" V2="2" />
</Root>

5.創建命名空間

對于一些企業級的xml格式,會非常的嚴格。特別是在同一個xml中可能會出現重復的項,但是我們又想區分開來,這個時候我們可以利用命名空間將他們分開(跟C#中的命名空間類似。)。

下面是創建命名空間的示例:

復制代碼 代碼如下:

/// <summary>
        /// 創建命名空間
        /// </summary>
        public static void CreateNamespace()
        {
            XElement xele = new XElement("{http://www.xamarin-cn.com}Root",
                new XElement("Item", "1"),
                new XElement("{http://www.baidu.com}Item", 2));
            xele.Save(Path);
        }

結果如下所示:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns="http://www.xamarin-cn.com">
  <Item xmlns="">1</Item>
  <Item xmlns="http://www.baidu.com">2</Item>
</Root>

從這個結果中我們可以看到對應的屬性中有了xmlns屬性,并且值就是我們賦給它的命名空間。

二、查詢并修改Xml

Linq to xml不僅僅是創建xml簡單,在查詢,編輯和刪除方面一樣是非常方便的。下面我們就會介紹這些。

首先我們創建一個QueryXml類,并在其中寫入如下的屬性:

復制代碼 代碼如下:

public static String Path
        {
            get
            {
                String path = String.Format("{0}//test1.xml", Environment.CurrentDirectory);
                return path;
            }
        }

同時在該路徑下新建一個test1.xml文件,并在其中寫入如下內容:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<Root>
   <Item v1="1" v2="2">Item1</Item>
   <Item v1="1" v2="2" >Item2</Item>
</Root>

 
下面我們就可以正式開始了。

1.通過文件讀取xml

既然我們要對xml查詢就需要讀取對應的xml文件,當然后面會介紹其他的方式。

代碼如下:

復制代碼 代碼如下:

/// <summary>
        /// 通過文件讀取xml
        /// </summary>
        public static void QueryElementByFile()
        {
            XElement xele = XElement.Load(Path);
            XElement xele1 = xele.Element("Item");
            Console.Write(xele1.Value.Trim());
            Console.ReadKey();
        }

我們可以利用XElement的靜態方法Load讀取指定路徑下的xml文件,這里我們不僅讀取了該xml文件,同時還獲取的該xml的第一個item的值并輸出。

所以我們可以看到如下的結果:

2.在指定節點前后添加新節點

上面我們僅僅只是讀取xml以及簡單的查詢,下面我們不僅僅查詢并且還要在該節點前后插入新的節點。

代碼如下:

復制代碼 代碼如下:

/// <summary>
        /// 在指定節點前后添加新節點
        /// </summary>
        public static void AddToElementAfterAndBefore()
        {
            XElement xele = XElement.Load(Path);
            var item = (from ele in xele.Elements("Item")
                        where ele.Value.Equals("Item2")
                        select ele).SingleOrDefault();
            if (item != null)
            {
                XElement nele = new XElement("NItem", "NItem");
                XElement nele2 = new XElement("BItem", "BItem");
                item.AddAfterSelf(nele);
                item.AddBeforeSelf(nele2);
                xele.Save(Path);
            }
        }

我們簡單的分析一下上面的代碼,首先我們利用linq從中查詢Item的值為Item2的節點,然后獲取其中第一個節點,然后通過AddAfterSelf和AddBeforeSelf在該節點的后面和前面分別添加新的節點。

添加完之后的xml結果如下:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Item v1="1" v2="2">Item1</Item>
  <BItem>BItem</BItem>
  <Item v1="1" v2="2">Item2</Item>
  <NItem>NItem</NItem>
</Root>

3.添加屬性到節點中

我們已經可以動態的添加節點,但是創建的時候不僅僅可以創建節點,并且還能創建屬性,下面我們可以通過SetAttributeValue去添加新的屬性或者修改現有屬性。

代碼如下:

復制代碼 代碼如下:

/// <summary>
        /// 添加屬性到節點中
        /// </summary>
        public static void AddAttributeToEle()
        {
            XElement xele = XElement.Parse(@"<?xml version='1.0' encoding='utf-8'?><Root><!--前面的注釋-->
<Item v1='1' v2='2'>Item1</Item><!--后面的注釋--><Item v1='1' v2='2' v3='3'>Item2</Item></Root>");
            var item = (from ele in xele.Elements("Item")
                        where ele.Value.Equals("Item2")
                        select ele).SingleOrDefault();
            item.SetAttributeValue("v3", "3");
            xele.Save(Path);
        }

我們可以明顯的看出,這里我們已經不是使用XElement.Load去讀取xml文件,而是通過直接讀取xml字符串。接著我們還是跟上面一樣去查詢,然后通過SetAttributeValue添加了新的屬性,并保存。

Xml內容如下:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <!--前面的注釋-->
  <Item v1="1" v2="2">Item1</Item>
  <!--后面的注釋-->
  <Item v1="1" v2="2" v3="3">Item2</Item>
</Root>

我們可以看到第二個Item中多了一個 v3=”3” 新的屬性。

4.添加注釋到指定節點前后

這里的語法基本跟添加節點到指定節點前后是相似的,只是讀取xml的方式不同。

代碼如下:

復制代碼 代碼如下:

/// <summary>
        /// 添加注釋到節點前后
        /// </summary>
        public static void AddCommentToAfterAndBefore()
        {
            TextReader tr = new StringReader(@"<?xml version='1.0' encoding='utf-8'?><Root><!--前面的注釋-->
<Item v1='1' v2='2'>Item1</Item><!--后面的注釋--><Item v1='1' v2='2' v3='3'>Item2</Item></Root>");
            XElement xele = XElement.Load(tr);
            var item = (from ele in xele.Elements("Item")
                        where ele.Value.Equals("Item1")
                        select ele).FirstOrDefault();
            if (item != null)
            {
                XComment xcom = new XComment("后面的注釋");
                XComment xcoma = new XComment("前面的注釋");
                item.AddAfterSelf(xcom);
                item.AddBeforeSelf(xcoma);
            }
            tr.Close();
            xele.Save(Path);
        }

上面我使用StringReader和TextReader讀取xml字符串并使用XElement.Load讀取該對象,然后就是在新建節點的時候新建的是注釋節點,最后利用一樣的語法添加到指定節點前后。

最終結果如下:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <!--前面的注釋-->
  <!--前面的注釋-->
  <Item v1="1" v2="2">Item1</Item>
  <!--后面的注釋-->
  <!--后面的注釋-->
  <Item v1="1" v2="2" v3="3">Item2</Item>
</Root>

5.替換指定節點

修改節點的值通過SetValue即可做到,但是有時涉及到子節點,而我們想一次性全部替換掉,那么我們就需要使用ReplaceWith。

代碼如下:

復制代碼 代碼如下:

/// <summary>
        /// 替換指定節點
        /// </summary>
        public static void ReplaceElement()
        {
            XElement xele = XElement.Load(Path);
            var item = (from ele in xele.Elements("Item")
                        where ele.Value.Equals("Item2")
                        select ele).FirstOrDefault();
            if (item != null)
            {
                item.ReplaceWith(new XElement("Item", "Item3"));
            }
            xele.Save(Path);
        }

這里的重點在于ReplaceWith方法,調用該方法會發生兩個操作。首先是刪除該節點,然后在該節點的位置上將我們的節點插入完成替換。

最后的xml結果如下:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <!--前面的注釋-->
  <!--前面的注釋-->
  <Item v1="1" v2="2">Item1</Item>
  <!--后面的注釋-->
  <!--后面的注釋-->
  <Item>Item3</Item>
</Root>

這樣我們很輕易的就替換了整個節點。

6.刪除指定屬性

前面我們介紹了創建、修改和添加屬性,但是還沒有介紹如何刪除指定的屬性,下面我們就通過一個簡單的實例來演示。

代碼如下:

復制代碼 代碼如下:

/// <summary>
        /// 刪除指定屬性
        /// </summary>
        public static void RemoveAttribute()
        {
            XElement xele = XElement.Load(Path);
            var item = (from ele in xele.Elements("Item")
                        where ele.Value.Equals("Item1")
                        select ele).FirstOrDefault().Attribute("v1");
            if (item != null)
            {
                item.Remove();
            }
            xele.Save(Path);
        }

我們首先查詢出指定的節點,然后指定某個屬性,最后調用XAttribute的Remove方法既可。

結果如下:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <!--前面的注釋-->
  <!--前面的注釋-->
  <Item v2="2">Item1</Item>
  <!--后面的注釋-->
  <!--后面的注釋-->
  <Item>Item3</Item>
</Root>

7.刪除指定節點

既然上面已經可以刪除屬性,自然也少不了刪除屬性。

代碼如下所示:

復制代碼 代碼如下:

/// <summary>
        /// 刪除指定節點
        /// </summary>
        public static void RemoveElement()
        {
            XElement xele = XElement.Load(Path);
            var item = (from ele in xele.Elements("Item")
                        where ele.Value.Equals("Item1")
                        select ele).FirstOrDefault();
            if (item != null)
            {
                item.Remove();
            }
            xele.Save(Path);
        }

依然是調用同樣的方法。

結果如下:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <!--前面的注釋-->
  <!--前面的注釋-->
  <!--后面的注釋-->
  <!--后面的注釋-->
  <Item>Item3</Item>
</Root>

三、按節點關系查詢

上面的查詢都是通過相關的條件進行查詢,但是我們有時僅僅只需要通過之間的關系即可,這樣反而可以避免很多的代碼,當然稍加探索可以發現其實XElement都提供給我們了。

我們依然要新建一個StructureXml類,并在其中新建一個屬性。

如下所示:

復制代碼 代碼如下:

public static String Path
        {
            get
            {
                String path = String.Format("{0}//test2.xml", Environment.CurrentDirectory);
                return path;
            }
        }

同時在該文件夾下新建一個test2.xml并寫入如下內容:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8" ?>
<Root>
  <Item>
    <SubItem1>
      1
    </SubItem1>
    <SubItem>
      <Child>
        sss
      </Child>
    </SubItem>
    <SubItem2>
      2
    </SubItem2>
  </Item>
</Root>

1.顯示指定節點的所有父節點

通過上面的xml文件,我們清晰的看出xml是具有結構性的,彼此之間都存在關系,而現在我們需要顯示某個節點的父級節點的名稱。

代碼如下所示:

復制代碼 代碼如下:

/// <summary>
        /// 顯示指定節點的所有父節點
        /// </summary>
        public static void ShowAllParentEle()
        {
            XElement xele = XElement.Load(Path);
            var item = (from ele in xele.Descendants("Child")
                        select ele).FirstOrDefault();
            if (item != null)
            {
                foreach (var sub in item.Ancestors())
                {
                    Console.WriteLine(sub.Name);
                }
                Console.WriteLine("----------------");
                foreach (var sub in item.AncestorsAndSelf())
                {
                    Console.WriteLine(sub.Name);
                }
                Console.ReadKey();
            }
        }

其中我們通過Descendants獲取最底的節點,然后使用Ancestors獲取所有的父級節點,而AncestorsAndSelf則表示包含本身。

最終結果如下所示:

我們從圖中看出,分割線前顯示的是不包含本身的,而下面是包含本身的。

2.顯示指定節點的所有子節點

我們不僅僅可以輸出一個節點的所有父級節點,同樣也可以輸出一個節點的所有子節點。

代碼如下所示:

復制代碼 代碼如下:

/// <summary>
        /// 顯示指定節點的所有子節點
        /// </summary>
        public static void ShowAllChildEle()
        {
            XElement xele = XElement.Load(Path);
            foreach (var sub in xele.Descendants())
            {
                Console.WriteLine(sub.Name);
            }
            Console.WriteLine("-----------------");
            foreach (var sub in xele.DescendantsAndSelf())
            {
                Console.WriteLine(sub.Name);
            }
            Console.ReadKey();
        }

這里我們依然是分成輸出子級節點以及包含自己的。

結果如下所示:

3.顯示同級節點之前的節點

既然有了父子關系,當然也少不了同級關系,首先我們先顯示同級節點之前的節點。

代碼如下所示:

復制代碼 代碼如下:

/// <summary>
        /// 顯示同級節點之前的節點
        /// </summary>
        public static void ShowPrevEle()
        {
            XElement xele = XElement.Load(Path);
            var item = (from ele in xele.Descendants("SubItem")
                        select ele).FirstOrDefault();
            if (item != null)
            {
                foreach (var sub in item.ElementsBeforeSelf())
                {
                    Console.WriteLine(sub.Name);
                }
            }
            Console.ReadKey();
        }

這里我們看到我們通過ElementsBeforeSelf獲取該節點之前的同級節點,當然我們還可以傳入參數作為限制條件。這里我們通過查詢獲取了SubItem這個節點,并顯示該節點之前的同級節點。

最終結果如下:

4.顯示同級節點后面的節點

作為上面的補充。

代碼如下所示:

復制代碼 代碼如下:

/// <summary>
        /// 顯示同級節點后面的節點
        /// </summary>
        public static void ShowNextEle()
        {
            XElement xele = XElement.Load(Path);
            var item = (from ele in xele.Descendants("SubItem")
                        select ele).FirstOrDefault();
            if (item != null)
            {
                foreach (var sub in item.ElementsAfterSelf())
                {
                    Console.WriteLine(sub.Name);
                }
            }
            Console.ReadKey();
        }

最終結果如下所示:

四、監聽xml事件

你可能會疑惑xml為什么還要監聽,其實這樣是有意義的,比如你要根據某個節點的值作為依賴,那么你就要監聽這個節點,如果這個節點發生改變的時候,

你才可以及時的作出反應。但是xml的事件監聽有一個特點,跟瀏覽器中的DOM事件類似,監聽父節點同樣也可以監聽的到它的子節點的事件。下面我們

通過一個簡單的實例來說明。

實例代碼如下:

復制代碼 代碼如下:

public static class EventXml
    {
        public static void BindChangeing()
        {
            XElement xele = new XElement("Root");
            xele.Changing += xele_Changing;
            xele.Changed += xele_Changed;
            xele.Add(new XElement("Item", "123"));
            var item = xele.Element("Item");
            item.ReplaceWith(new XElement("Item", "2"));
            item = xele.Element("Item");
            item.Remove();
            Console.ReadKey();
        }

        static void xele_Changed(object sender, XObjectChangeEventArgs e)
        {
            XElement ele = sender as XElement;
            Console.WriteLine(String.Format("已完成 {0}-{1}", ele.Name, e.ObjectChange));
        }

        static void xele_Changing(object sender, XObjectChangeEventArgs e)
        {
            XElement ele = sender as XElement;
            Console.WriteLine(String.Format("正在進行中 {0}-{1}", ele.Name, e.ObjectChange));
        }
}


其中的關鍵就是Changing和Changed事件,其次就是在事件中判斷事件的來源。

最終結果如下所示:

五、處理xml流

在實際的商業化的開發中,xml不可能僅僅保存這么點數據。有可能保存著非常多的數據。但是我們還是按照以往的方式,就會將xml全部讀取進內存。

這樣會占據很多內存,影響系統的性能,針對這種情況我們需要使用流的方式去處理xml,因為流會按照我們的順序讀取部分xml進內存,并不會將所

有xml都讀取進內存。

Xml文件內容如下所示:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8" ?>
<Root>
  <SubItem>1</SubItem>
  <SubItem>1</SubItem>
  <SubItem>1</SubItem>
  <Item>A</Item>
  <SubItem>1</SubItem>
  <Item>B</Item>
</Root>

代碼如下所示:

復制代碼 代碼如下:

public static class ReadXmlStream
    {
        public static String Path
        {
            get
            {
                String path = String.Format("{0}//test3.xml", Environment.CurrentDirectory);
                return path;
            }
        }

        /// <summary>
        /// 流式處理XML
        /// </summary>
        public static void ReadXml()
        {
            XmlReader reader = XmlReader.Create(Path);
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element && reader.Name.Equals("Item"))
                {
                    XElement ele = XElement.ReadFrom(reader) as XElement;
                    Console.WriteLine(ele.Value.Trim());
                }
            }
            Console.ReadKey();
        }
}

這里我們通過XmlReader的Create靜態方法打開xml文件,并通過Read一個節點的進行讀取,并判斷該節點的類型。

最終結果如下:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产91久久久久久不卡| 亚洲成av人乱码色午夜| 国内精久久久久久久久久人| 欧美视频专区一二在线观看| 亚洲一区二区精品| 亚洲精品suv精品一区二区| 日韩av片永久免费网站| 在线看日韩欧美| 国产福利精品在线| 日韩在线观看网址| 日韩欧美主播在线| 2019亚洲日韩新视频| 日本精品性网站在线观看| www国产亚洲精品久久网站| 成人信息集中地欧美| 91精品中国老女人| 日韩欧美亚洲范冰冰与中字| 成人乱色短篇合集| 成人动漫网站在线观看| 神马国产精品影院av| www日韩欧美| 国产精品一区电影| 日韩av在线免费观看一区| 亚洲免费高清视频| 成人黄在线观看| 91精品国产综合久久香蕉922| 亚洲国产精品中文| 国产精品视频专区| 福利二区91精品bt7086| 久久男人av资源网站| 亚洲免费影视第一页| 91在线免费网站| 红桃视频成人在线观看| 欧美成人四级hd版| 成人97在线观看视频| 色综合色综合网色综合| 日韩成人在线观看| 一区二区三区四区在线观看视频| 久久国产精品影片| 午夜精品国产精品大乳美女| 91在线国产电影| 国产精品va在线播放| 亚洲性av网站| www.亚洲人.com| 亚洲精品国产美女| 成人福利在线观看| 国产成人jvid在线播放| 福利一区福利二区微拍刺激| 国产精品视频精品| 日韩精品久久久久久久玫瑰园| 亚洲精品自拍视频| 亚洲香蕉成人av网站在线观看| 欧美一区二区大胆人体摄影专业网站| 精品久久久久久久久久ntr影视| 久久精品视频va| 久久久久久久久久久亚洲| 中国china体内裑精亚洲片| 日产精品99久久久久久| 亚洲国产精品va在线| 日韩欧美主播在线| 欧美成人激情视频| 日本欧美中文字幕| 欧美在线一区二区视频| 奇米四色中文综合久久| 欧美国产乱视频| 亚洲色图美腿丝袜| 亚洲激情视频网| 国产成人福利夜色影视| 成人中文字幕在线观看| 久久久午夜视频| 国产美女直播视频一区| 成人疯狂猛交xxx| 久久精品中文字幕| 亚洲欧美日韩精品| 亚洲人成网站999久久久综合| 国产精品久久久久国产a级| 国产区精品在线观看| 成年人精品视频| 亚洲第一二三四五区| 亚洲精品久久久久| 亚洲国产99精品国自产| 亚洲毛片在线观看.| 日韩黄色高清视频| 国产亚洲欧美视频| 日韩在线中文视频| 欧美日本国产在线| 日韩免费看的电影电视剧大全| 国产视频精品va久久久久久| 在线观看日韩欧美| 91亚洲精品在线| 蜜臀久久99精品久久久久久宅男| 九九热视频这里只有精品| 国产精品日韩精品| 久久好看免费视频| 538国产精品一区二区在线| 69av成年福利视频| 亚洲午夜色婷婷在线| 永久免费精品影视网站| 国产一区二区三区视频免费| 91久久久久久久| 欧美日韩成人精品| 国产日韩在线播放| 久久99国产综合精品女同| 91网站免费看| 欧美国产日韩精品| 热久久99这里有精品| 国模视频一区二区三区| 亚洲人成网7777777国产| 欧美日韩在线影院| 欧美日韩国产专区| 国语自产精品视频在线看一大j8| 国产精品美女视频网站| 国产精品稀缺呦系列在线| 国产成人精品免高潮费视频| 日韩av影院在线观看| 国产综合福利在线| 97精品在线视频| 国产精品久久久久久久久久久不卡| 国产亚洲激情视频在线| 国产成人在线亚洲欧美| 大胆欧美人体视频| 亚洲天堂男人的天堂| 久久久精品免费视频| 青青青国产精品一区二区| 欧美孕妇孕交黑巨大网站| 成人在线激情视频| 国产高清视频一区三区| 欧美一区二粉嫩精品国产一线天| 国产一区二区精品丝袜| 欧美在线国产精品| 日韩在线视频免费观看高清中文| 日韩av中文字幕在线播放| 91免费看视频.| 精品人伦一区二区三区蜜桃免费| 国产视频久久久| 国产精品欧美一区二区| 欧美色欧美亚洲高清在线视频| 日韩欧美国产免费播放| 社区色欧美激情 | 中文字幕日韩在线观看| 久久久久久高潮国产精品视| 成人有码视频在线播放| 91av在线视频观看| 亚洲网站视频福利| 欧美在线观看视频| 国产欧美 在线欧美| 中文字幕亚洲二区| 亚洲第一区第二区| 欧美午夜电影在线| 亚洲在线观看视频| 国产精品久久久久aaaa九色| 欧美一二三视频| 97视频网站入口| 色婷婷成人综合| 正在播放亚洲1区| 亚洲精品视频中文字幕| 欧美在线观看网站| 91中文在线观看| 日韩美女在线观看| 中文字幕亚洲无线码在线一区| 亚洲第一国产精品| 日韩视频免费在线| 国产精品一区二区av影院萌芽| 久久久www成人免费精品|