日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

第一百二十六节,JavaScript,XPath操作xml节点

發布時間:2023/12/10 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第一百二十六节,JavaScript,XPath操作xml节点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第一百二十六節,JavaScript,XPath操作xml節點

?

學習要點:

1.IE中的XPath

2.W3C中的XPath

3.XPath跨瀏覽器兼容

?

XPath是一種節點查找手段,對比之前使用標準DOM去查找XML中的節點方式,大大降低了查找難度,方便開發者使用。但是,DOM3級以前的標準并沒有就XPath做出規范;直到DOM3在首次推薦到標準規范行列。大部分瀏覽器實現了這個標準,IE則以自己的方式實現了XPath。

?

一.IE中的XPath

在IE8及之前的瀏覽器,XPath是采用內置基于ActiveX的XML DOM文檔對象實現的。在每一個節點上提供了兩個方法:selectSingleNode()和selectNodes()。

selectSingleNode()方法接受一個XPath模式(也就是查找路徑),找到匹配的第一個節點并將它返回,沒有則返回null。

selectSingleNode()方法,查找xml節點,查找單一節點如果有相同的節點只返回第一個節點,有參參數是要查找的節點路徑,此方法只支持IE并且是IE9以下
使用方式
XML DOM對象.selectSingleNode('要查找的節點路徑')

var xml = '<root><user id="5">Lee</user><user id="6">Koko</user></root>'; //定義xml字符串 var xmldom = getXMLDOM(xml); //創建XML DOM對象,接收xml字符串 //通過XML DOM對象查找xml標簽節點 var chzhao = xmldom.selectSingleNode('root/user'); //selectSingleNode()方法,查找xml節點,有參參數是要查找的節點路徑,此方法只支持IE并且是IE9以下 alert(serializeXML(chzhao)); //執行序列化函數,序列化查找到的節點 alert(chzhao.tagName); //打印查找到的元素標簽名稱 alert(chzhao.firstChild.nodeValue); //打印查找到的元素文本內容//首先,我們需要跨瀏覽器獲取XML DOM function getXMLDOM(xmlStr) { //自定義跨瀏覽器創建xml DOM對象,接收一個參數xml字符串var xmlDom = null; //初始化一個對象if (typeof window.DOMParser != 'undefined') { //判斷DOMParser類型不等于undefined說明支持//創建DOMParser對象,并且創建xml DOM對象xmlDom = (new DOMParser()).parseFromString(xmlStr, 'text/xml');//獲取錯誤信息的parsererror標簽var errors = xmlDom.getElementsByTagName('parsererror');//判斷錯誤信息標簽返回集合長度大于0,說明xml有錯誤if (errors.length > 0) {//創建一個錯誤對象,獲取到第一個錯誤標簽,并且獲取到他的文本內容throw new Error('XML解析錯誤:' + errors[0].firstChild.nodeValue);}//如果不支持DOMParser類型,嘗試IE的方法} else if (typeof window.ActiveXObject != 'undefined') { //判斷ActiveXObject類型不等于undefined說明支持var version = [ //創建一個數組,元素分別為3個xml版本'MSXML2.DOMDocument.6.0','MSXML2.DOMDocument.3.0','MSXML2.DOMDocument'];for (var i = 0; i < version.length; i++) { //根據數組的長度循環次數try {//嘗試著執行每次循環到的xml版本,創建xml對象xmlDom = new ActiveXObject(version[i]);} catch (e) { //如果出錯跳過執行第二次循環//跳過 }}xmlDom.loadXML(xmlStr); //載入xml字符串if (xmlDom.parseError != 0) { //判斷載入xml錯誤返回代碼,如果不等于0說明xml有錯//創建一個錯誤對象,返回錯誤的解釋信息throw new Error('XML解析錯誤:' + xmlDom.parseError.reason);}} else { //如果 上面兩種方式都不支持//創建一個錯誤對象,拋出您所使用的系統或瀏覽器不支持XML DOM!throw new Error('您所使用的系統或瀏覽器不支持XML DOM!');}return xmlDom; //最后返回創建的xmlDOM對象 }//其次,我們還必須跨瀏覽器序列化XML function serializeXML(xmlDom) { //序列化xml函數,接收xmlDOM對象對象var xml = ''; //初始化一個變量等于空字符串if (typeof XMLSerializer != 'undefined') { //判斷XMLSerializer類型,不等于undefined,說明支持序列化//給xml重新賦值,創建XMLSerializer對象,并且使用serializeToString方法序列化xml = (new XMLSerializer()).serializeToString(xmlDom);//如果不支持XMLSerializer類型} else if (typeof xmlDom.xml != 'undefined') { //判斷IE方式xmlDOM對象下的xml屬性是否等于undefined,不等于說明支持//給xml重新賦值,序列化xmlxml = xmlDom.xml;} else { //如果上面兩種都不支持//創建一個錯誤對象,拋出無法解析XML!錯誤信息throw new Error('無法解析XML!');}return xml; //最后返回序列化 }

?

上下文節點

上下文節點:我們通過xmlDom這個對象實例調用方法,而xmlDom這個對象實例其實就是一個上下文節點,這個節點指針指向的是根,也就是root元素之前。那么如果我們把這個指針指向user元素之前,那么結果就會有所變化。

通過xmlDom,并且使用root/user的路徑

//通過xmlDom,并且使用root/user的路徑var user = xmlDom.selectSingleNode('root/user');alert(user.tagName); //user

通過xmlDom.documentElement,并且使用user路徑,省去了root

//通過xmlDom.documentElement,并且使用user路徑,省去了rootvar user = xmlDom.documentElement.selectSingleNode('user');alert(user.tagName); //user

通過xmlDom,并且使用user路徑,省去了root

//通過xmlDom,并且使用user路徑,省去了rootvar user = xmlDom.selectSingleNode('user');alert(user.tagName); //找不到了,出錯?

PS:xmlDom和xmlDom.documentElement都是上下文節點,主要就是定位當前路徑查找的指針,而xmlDom對象實例的指針就是在最根上。

?

XPath常用語法

?

通過user[n]來獲取第n+1條節點,PS:XPath其實是按1為起始值的,也就是通過索引位置來獲取對應的標簽

//通過user[n]來獲取第n+1條節點,PS:XPath其實是按1為起始值的 var user = xmlDom.selectSingleNode('root/user[1]'); alert(user.xml);

通過text()獲取節點內的值

//通過text()獲取節點內的值 var user = xmlDom.selectSingleNode('root/user/text()'); alert(user.xml); alert(user.nodeValue);

通過//user 表示在整個xml獲取到user節點,不關心任何層次,通過雙斜杠獲取節點

//通過//user表示在整個xml獲取到user節點,不關心任何層次 var user = xmlDom.selectSingleNode('//user'); alert(user.xml);

通過root//user表示在root包含的層次下獲取到user節點,在root內不關心任何層次,通過指定節點下雙斜杠獲取節點

//通過root//user表示在root包含的層次下獲取到user節點,在root內不關心任何層次 var user = xmlDom.selectSingleNode('root//user'); alert(user.tagName);

通過root/user[@id=6]表示獲取user中id=6的節點,通過id獲取指定節點

//通過root/user[@id=6]表示獲取user中id=6的節點 var user = xmlDom.selectSingleNode('root/user[@id=6]'); alert(user.xml);

PS:更多的XPath語法,可以參考XPath手冊或者XML DOM手冊進行參考,這里只提供了最常用的語法。

?

selectNodes()方法,查找xml節點,返回相同名稱的節點集合,有參參數是要查找的節點路徑,此方法只支持IE并且是IE9以下
使用方式
XML DOM對象.selectNodes('要查找的節點路徑')

var xml = '<root><user id="5">Lee</user><user id="6">Koko</user></root>'; //定義xml字符串 var xmldom = getXMLDOM(xml); //創建XML DOM對象,接收xml字符串 //通過XML DOM對象查找xml標簽節點 var chzhao = xmldom.selectNodes('root/user'); //selectNodes()方法,查找xml節點,返回相同名稱的節點集合,有參參數是要查找的節點路徑,此方法只支持IE并且是IE9以下 alert(chzhao.length); //查看節點集合長度 alert(serializeXML(chzhao[0])); //通過索引,執行序列化函數,序列化查找到的節點 alert(chzhao[0].tagName); //通過索引打印查找到的元素標簽名稱 alert(chzhao[0].firstChild.nodeValue); //通過索引打印查找到的元素文本內容//首先,我們需要跨瀏覽器獲取XML DOM function getXMLDOM(xmlStr) { //自定義跨瀏覽器創建xml DOM對象,接收一個參數xml字符串var xmlDom = null; //初始化一個對象if (typeof window.DOMParser != 'undefined') { //判斷DOMParser類型不等于undefined說明支持//創建DOMParser對象,并且創建xml DOM對象xmlDom = (new DOMParser()).parseFromString(xmlStr, 'text/xml');//獲取錯誤信息的parsererror標簽var errors = xmlDom.getElementsByTagName('parsererror');//判斷錯誤信息標簽返回集合長度大于0,說明xml有錯誤if (errors.length > 0) {//創建一個錯誤對象,獲取到第一個錯誤標簽,并且獲取到他的文本內容throw new Error('XML解析錯誤:' + errors[0].firstChild.nodeValue);}//如果不支持DOMParser類型,嘗試IE的方法} else if (typeof window.ActiveXObject != 'undefined') { //判斷ActiveXObject類型不等于undefined說明支持var version = [ //創建一個數組,元素分別為3個xml版本'MSXML2.DOMDocument.6.0','MSXML2.DOMDocument.3.0','MSXML2.DOMDocument'];for (var i = 0; i < version.length; i++) { //根據數組的長度循環次數try {//嘗試著執行每次循環到的xml版本,創建xml對象xmlDom = new ActiveXObject(version[i]);} catch (e) { //如果出錯跳過執行第二次循環//跳過 }}xmlDom.loadXML(xmlStr); //載入xml字符串if (xmlDom.parseError != 0) { //判斷載入xml錯誤返回代碼,如果不等于0說明xml有錯//創建一個錯誤對象,返回錯誤的解釋信息throw new Error('XML解析錯誤:' + xmlDom.parseError.reason);}} else { //如果 上面兩種方式都不支持//創建一個錯誤對象,拋出您所使用的系統或瀏覽器不支持XML DOM!throw new Error('您所使用的系統或瀏覽器不支持XML DOM!');}return xmlDom; //最后返回創建的xmlDOM對象 }//其次,我們還必須跨瀏覽器序列化XML function serializeXML(xmlDom) { //序列化xml函數,接收xmlDOM對象對象var xml = ''; //初始化一個變量等于空字符串if (typeof XMLSerializer != 'undefined') { //判斷XMLSerializer類型,不等于undefined,說明支持序列化//給xml重新賦值,創建XMLSerializer對象,并且使用serializeToString方法序列化xml = (new XMLSerializer()).serializeToString(xmlDom);//如果不支持XMLSerializer類型} else if (typeof xmlDom.xml != 'undefined') { //判斷IE方式xmlDOM對象下的xml屬性是否等于undefined,不等于說明支持//給xml重新賦值,序列化xmlxml = xmlDom.xml;} else { //如果上面兩種都不支持//創建一個錯誤對象,拋出無法解析XML!錯誤信息throw new Error('無法解析XML!');}return xml; //最后返回序列化 }

?

二.W3C下的XPath

在DOM3級XPath規范定義的類型中,最重要的兩個類型是XPathEvaluator和XPathResult。其中,XPathEvaluator用于在特定上下文對XPath表達式求值。

XPathEvaluator的方法

方法

說明

createExpression(e, n)

將XPath表達式及命名空間轉化成XPathExpression

createNSResolver(n)

根據n命名空間創建一個新的XPathNSResolver對象

evaluate(e, c, n ,t ,r)

結合上下文來獲取XPath表達式的值

W3C實現XPath查詢節點比IE來的復雜,首先第一步就是需要得到XPathResult對象的實例。得到這個對象實例有兩種方法,一種是通過創建XPathEvaluator對象執行evaluate()方法,另一種是直接通過上下文節點對象(比如xmlDom)來執行evaluate()方法。

XPathResult對象

XPathEvaluator類型

第一個方式,首先new?XPathEvaluator類型,然后執行XPathEvaluator類型下的evaluate()方法來創建XPathResult對象

evaluate()方法,創建XPathResult對象有5個參數,1要查找的xml標簽路徑,2上下文節點對象也就是XMLDOM對象,3命名空間求解器(通常是null),4返回結果類型,5保存結果的XPathResult對象(通常是null)。
使用方式:
XPathResult對象.evaluate(要查找的xml標簽路徑,XMLDOM對象,null,返回結果類型,null)

對于返回的結果類型,有10中不同的類型,常用的是紅字的兩個類型

常量

說明

XPathResult.ANY_TYPE

返回符合XPath表達式類型的數據

XPathResult.ANY_UNORDERED_NODE_TYPE

返回匹配節點的節點集合,但順序可能與文檔中的節點的順序不匹配

XPathResult.BOOLEAN_TYPE

返回布爾值

XPathResult.FIRST_ORDERED_NODE_TYPE

返回只包含一個節點的節點集合,且這個節點是在文檔中第一個匹配的節點

XPathResult.NUMBER_TYPE

返回數字值

XPathResult.ORDERED_NODE_ITERATOR_TYPE

返回匹配節點的節點集合,順序為節點在文檔中出現的順序。這是最常用到的結果類型

XPathResult.ORDERED_NODE_SNAPSHOT_TYPE

返回節點集合快照,在文檔外捕獲節點,這樣將來對文檔的任何修改都不會影響這個節點列表

XPathResult.STRING_TYPE

返回字符串值

XPathResult.UNORDERED_NODE_ITERATOR_TYPE

返回匹配節點的節點集合,不過順序可能不會按照節點在文檔中出現的順序排列

XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE

返回節點集合快照,在文檔外捕獲節點,這樣將來對文檔的任何修改都不會影響這個節點列表

PS:上面的常量過于繁重,對于我們只需要學習了解,其實也就需要兩個:1.獲取一個單一節、2.獲取一個節點集合。

兩種方式創建XPathResult對象

使用XPathEvaluator對象創建XPathResult

var xml = '<root><user id="5">Lee</user><user id="6">Koko</user></root>'; //定義xml字符串 var xmldom = getXMLDOM(xml); //創建XML DOM對象,接收xml字符串//使用XPathEvaluator對象創建XPathResult var eva = new XPathEvaluator(); //創建XPathResult對象 //evaluate()方法,創建XPathResult對象有5個參數,1要查找的xml標簽路徑,2上下文節點對象也就是XMLDOM對象,3命名空間求解器(通常是null),4返回結果類型,5保存結果的XPathResult對象(通常是null)。 var result = eva.evaluate('root/user', xmldom , null,XPathResult.FIRST_ORDERED_NODE_TYPE, null); alert(result); //返回單一節點集合//首先,我們需要跨瀏覽器獲取XML DOM function getXMLDOM(xmlStr) { //自定義跨瀏覽器創建xml DOM對象,接收一個參數xml字符串var xmlDom = null; //初始化一個對象if (typeof window.DOMParser != 'undefined') { //判斷DOMParser類型不等于undefined說明支持//創建DOMParser對象,并且創建xml DOM對象xmlDom = (new DOMParser()).parseFromString(xmlStr, 'text/xml');//獲取錯誤信息的parsererror標簽var errors = xmlDom.getElementsByTagName('parsererror');//判斷錯誤信息標簽返回集合長度大于0,說明xml有錯誤if (errors.length > 0) {//創建一個錯誤對象,獲取到第一個錯誤標簽,并且獲取到他的文本內容throw new Error('XML解析錯誤:' + errors[0].firstChild.nodeValue);}//如果不支持DOMParser類型,嘗試IE的方法} else if (typeof window.ActiveXObject != 'undefined') { //判斷ActiveXObject類型不等于undefined說明支持var version = [ //創建一個數組,元素分別為3個xml版本'MSXML2.DOMDocument.6.0','MSXML2.DOMDocument.3.0','MSXML2.DOMDocument'];for (var i = 0; i < version.length; i++) { //根據數組的長度循環次數try {//嘗試著執行每次循環到的xml版本,創建xml對象xmlDom = new ActiveXObject(version[i]);} catch (e) { //如果出錯跳過執行第二次循環//跳過 }}xmlDom.loadXML(xmlStr); //載入xml字符串if (xmlDom.parseError != 0) { //判斷載入xml錯誤返回代碼,如果不等于0說明xml有錯//創建一個錯誤對象,返回錯誤的解釋信息throw new Error('XML解析錯誤:' + xmlDom.parseError.reason);}} else { //如果 上面兩種方式都不支持//創建一個錯誤對象,拋出您所使用的系統或瀏覽器不支持XML DOM!throw new Error('您所使用的系統或瀏覽器不支持XML DOM!');}return xmlDom; //最后返回創建的xmlDOM對象 }//其次,我們還必須跨瀏覽器序列化XML function serializeXML(xmlDom) { //序列化xml函數,接收xmlDOM對象對象var xml = ''; //初始化一個變量等于空字符串if (typeof XMLSerializer != 'undefined') { //判斷XMLSerializer類型,不等于undefined,說明支持序列化//給xml重新賦值,創建XMLSerializer對象,并且使用serializeToString方法序列化xml = (new XMLSerializer()).serializeToString(xmlDom);//如果不支持XMLSerializer類型} else if (typeof xmlDom.xml != 'undefined') { //判斷IE方式xmlDOM對象下的xml屬性是否等于undefined,不等于說明支持//給xml重新賦值,序列化xmlxml = xmlDom.xml;} else { //如果上面兩種都不支持//創建一個錯誤對象,拋出無法解析XML!錯誤信息throw new Error('無法解析XML!');}return xml; //最后返回序列化 }

使用上下文節點對象(xmlDom)創建XPathResult對象,就是直接在XMLDOM對象執行evaluate()方法

var xml = '<root><user id="5">Lee</user><user id="6">Koko</user></root>'; //定義xml字符串 var xmldom = getXMLDOM(xml); //創建XML DOM對象,接收xml字符串//使用上下文節點對象(xmlDom)創建XPathResult var result = xmldom.evaluate('root/user', xmldom, null,XPathResult.FIRST_ORDERED_NODE_TYPE, null); alert(result); //返回單一節點集合//首先,我們需要跨瀏覽器獲取XML DOM function getXMLDOM(xmlStr) { //自定義跨瀏覽器創建xml DOM對象,接收一個參數xml字符串var xmlDom = null; //初始化一個對象if (typeof window.DOMParser != 'undefined') { //判斷DOMParser類型不等于undefined說明支持//創建DOMParser對象,并且創建xml DOM對象xmlDom = (new DOMParser()).parseFromString(xmlStr, 'text/xml');//獲取錯誤信息的parsererror標簽var errors = xmlDom.getElementsByTagName('parsererror');//判斷錯誤信息標簽返回集合長度大于0,說明xml有錯誤if (errors.length > 0) {//創建一個錯誤對象,獲取到第一個錯誤標簽,并且獲取到他的文本內容throw new Error('XML解析錯誤:' + errors[0].firstChild.nodeValue);}//如果不支持DOMParser類型,嘗試IE的方法} else if (typeof window.ActiveXObject != 'undefined') { //判斷ActiveXObject類型不等于undefined說明支持var version = [ //創建一個數組,元素分別為3個xml版本'MSXML2.DOMDocument.6.0','MSXML2.DOMDocument.3.0','MSXML2.DOMDocument'];for (var i = 0; i < version.length; i++) { //根據數組的長度循環次數try {//嘗試著執行每次循環到的xml版本,創建xml對象xmlDom = new ActiveXObject(version[i]);} catch (e) { //如果出錯跳過執行第二次循環//跳過 }}xmlDom.loadXML(xmlStr); //載入xml字符串if (xmlDom.parseError != 0) { //判斷載入xml錯誤返回代碼,如果不等于0說明xml有錯//創建一個錯誤對象,返回錯誤的解釋信息throw new Error('XML解析錯誤:' + xmlDom.parseError.reason);}} else { //如果 上面兩種方式都不支持//創建一個錯誤對象,拋出您所使用的系統或瀏覽器不支持XML DOM!throw new Error('您所使用的系統或瀏覽器不支持XML DOM!');}return xmlDom; //最后返回創建的xmlDOM對象 }//其次,我們還必須跨瀏覽器序列化XML function serializeXML(xmlDom) { //序列化xml函數,接收xmlDOM對象對象var xml = ''; //初始化一個變量等于空字符串if (typeof XMLSerializer != 'undefined') { //判斷XMLSerializer類型,不等于undefined,說明支持序列化//給xml重新賦值,創建XMLSerializer對象,并且使用serializeToString方法序列化xml = (new XMLSerializer()).serializeToString(xmlDom);//如果不支持XMLSerializer類型} else if (typeof xmlDom.xml != 'undefined') { //判斷IE方式xmlDOM對象下的xml屬性是否等于undefined,不等于說明支持//給xml重新賦值,序列化xmlxml = xmlDom.xml;} else { //如果上面兩種都不支持//創建一個錯誤對象,拋出無法解析XML!錯誤信息throw new Error('無法解析XML!');}return xml; //最后返回序列化 }

相對而言,第二種簡單方便一點,但evaluate方法有五個屬性:1.XPath路徑、2.上下文節點對象、3.命名空間求解器(通常是null)、4.返回結果類型、5保存結果的XPathResult對象(通常是null)。

?

獲取xml節點

1.獲取一個單一節點

singleNodeValue屬性,得到XPathResult對象里的單一節點對象,獲取返回類型XPathResult.FIRST_ORDERED_NODE_TYPE的節點對象

var xml = '<root><user id="5">Lee</user><user id="6">Koko</user></root>'; //定義xml字符串 var xmldom = getXMLDOM(xml); //創建XML DOM對象,接收xml字符串var result = xmldom.evaluate('root/user', xmldom, null,XPathResult.FIRST_ORDERED_NODE_TYPE, null); if (result !== null) {//singleNodeValue屬性,得到XPathResult對象里的節點對象alert(result.singleNodeValue.tagName); //打印出節點的標簽名稱 }//首先,我們需要跨瀏覽器獲取XML DOM function getXMLDOM(xmlStr) { //自定義跨瀏覽器創建xml DOM對象,接收一個參數xml字符串var xmlDom = null; //初始化一個對象if (typeof window.DOMParser != 'undefined') { //判斷DOMParser類型不等于undefined說明支持//創建DOMParser對象,并且創建xml DOM對象xmlDom = (new DOMParser()).parseFromString(xmlStr, 'text/xml');//獲取錯誤信息的parsererror標簽var errors = xmlDom.getElementsByTagName('parsererror');//判斷錯誤信息標簽返回集合長度大于0,說明xml有錯誤if (errors.length > 0) {//創建一個錯誤對象,獲取到第一個錯誤標簽,并且獲取到他的文本內容throw new Error('XML解析錯誤:' + errors[0].firstChild.nodeValue);}//如果不支持DOMParser類型,嘗試IE的方法} else if (typeof window.ActiveXObject != 'undefined') { //判斷ActiveXObject類型不等于undefined說明支持var version = [ //創建一個數組,元素分別為3個xml版本'MSXML2.DOMDocument.6.0','MSXML2.DOMDocument.3.0','MSXML2.DOMDocument'];for (var i = 0; i < version.length; i++) { //根據數組的長度循環次數try {//嘗試著執行每次循環到的xml版本,創建xml對象xmlDom = new ActiveXObject(version[i]);} catch (e) { //如果出錯跳過執行第二次循環//跳過 }}xmlDom.loadXML(xmlStr); //載入xml字符串if (xmlDom.parseError != 0) { //判斷載入xml錯誤返回代碼,如果不等于0說明xml有錯//創建一個錯誤對象,返回錯誤的解釋信息throw new Error('XML解析錯誤:' + xmlDom.parseError.reason);}} else { //如果 上面兩種方式都不支持//創建一個錯誤對象,拋出您所使用的系統或瀏覽器不支持XML DOM!throw new Error('您所使用的系統或瀏覽器不支持XML DOM!');}return xmlDom; //最后返回創建的xmlDOM對象 }//其次,我們還必須跨瀏覽器序列化XML function serializeXML(xmlDom) { //序列化xml函數,接收xmlDOM對象對象var xml = ''; //初始化一個變量等于空字符串if (typeof XMLSerializer != 'undefined') { //判斷XMLSerializer類型,不等于undefined,說明支持序列化//給xml重新賦值,創建XMLSerializer對象,并且使用serializeToString方法序列化xml = (new XMLSerializer()).serializeToString(xmlDom);//如果不支持XMLSerializer類型} else if (typeof xmlDom.xml != 'undefined') { //判斷IE方式xmlDOM對象下的xml屬性是否等于undefined,不等于說明支持//給xml重新賦值,序列化xmlxml = xmlDom.xml;} else { //如果上面兩種都不支持//創建一個錯誤對象,拋出無法解析XML!錯誤信息throw new Error('無法解析XML!');}return xml; //最后返回序列化 }

2.獲取節點集合

?iterateNext()方法,得到XPathResult對象里的集合節點對象,獲取返回類型XPathResult.ORDERED_NODE_ITERATOR_TYPE的節點對象

var xml = '<root><user id="5">Lee</user><user id="6">Koko</user></root>'; //定義xml字符串 var xmldom = getXMLDOM(xml); //創建XML DOM對象,接收xml字符串//使用上下文節點對象(xmlDom)創建XPathResult,返回類型為xml標簽集合 var result = xmldom.evaluate('root/user', xmldom, null,XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); if (result !== null) { //判斷集合不為空var nodes = []; //創建空數組var node = result.iterateNext(); //獲取到集合里的一個標簽對象while (node !== null) { //判斷獲取集合里的一個標簽對象不為空,循環這個節點集合nodes.push(node); //將循環到的節點添加到初始化數組node = result.iterateNext(); //再次取集合里的一個標簽對象,進行迭代 } }alert(serializeXML(nodes[0])); //序列化打印第一個節點 alert(serializeXML(nodes[1])); //序列化打印第二個節點//首先,我們需要跨瀏覽器獲取XML DOM function getXMLDOM(xmlStr) { //自定義跨瀏覽器創建xml DOM對象,接收一個參數xml字符串var xmlDom = null; //初始化一個對象if (typeof window.DOMParser != 'undefined') { //判斷DOMParser類型不等于undefined說明支持//創建DOMParser對象,并且創建xml DOM對象xmlDom = (new DOMParser()).parseFromString(xmlStr, 'text/xml');//獲取錯誤信息的parsererror標簽var errors = xmlDom.getElementsByTagName('parsererror');//判斷錯誤信息標簽返回集合長度大于0,說明xml有錯誤if (errors.length > 0) {//創建一個錯誤對象,獲取到第一個錯誤標簽,并且獲取到他的文本內容throw new Error('XML解析錯誤:' + errors[0].firstChild.nodeValue);}//如果不支持DOMParser類型,嘗試IE的方法} else if (typeof window.ActiveXObject != 'undefined') { //判斷ActiveXObject類型不等于undefined說明支持var version = [ //創建一個數組,元素分別為3個xml版本'MSXML2.DOMDocument.6.0','MSXML2.DOMDocument.3.0','MSXML2.DOMDocument'];for (var i = 0; i < version.length; i++) { //根據數組的長度循環次數try {//嘗試著執行每次循環到的xml版本,創建xml對象xmlDom = new ActiveXObject(version[i]);} catch (e) { //如果出錯跳過執行第二次循環//跳過 }}xmlDom.loadXML(xmlStr); //載入xml字符串if (xmlDom.parseError != 0) { //判斷載入xml錯誤返回代碼,如果不等于0說明xml有錯//創建一個錯誤對象,返回錯誤的解釋信息throw new Error('XML解析錯誤:' + xmlDom.parseError.reason);}} else { //如果 上面兩種方式都不支持//創建一個錯誤對象,拋出您所使用的系統或瀏覽器不支持XML DOM!throw new Error('您所使用的系統或瀏覽器不支持XML DOM!');}return xmlDom; //最后返回創建的xmlDOM對象 }//其次,我們還必須跨瀏覽器序列化XML function serializeXML(xmlDom) { //序列化xml函數,接收xmlDOM對象對象var xml = ''; //初始化一個變量等于空字符串if (typeof XMLSerializer != 'undefined') { //判斷XMLSerializer類型,不等于undefined,說明支持序列化//給xml重新賦值,創建XMLSerializer對象,并且使用serializeToString方法序列化xml = (new XMLSerializer()).serializeToString(xmlDom);//如果不支持XMLSerializer類型} else if (typeof xmlDom.xml != 'undefined') { //判斷IE方式xmlDOM對象下的xml屬性是否等于undefined,不等于說明支持//給xml重新賦值,序列化xmlxml = xmlDom.xml;} else { //如果上面兩種都不支持//創建一個錯誤對象,拋出無法解析XML!錯誤信息throw new Error('無法解析XML!');}return xml; //最后返回序列化 }

PS:節點集合的獲取方式,是通過迭代器遍歷而來的,我們保存到數據中就模擬出IE相似的風格。

?

三.XPath跨瀏覽器兼容

如果要做W3C和IE的跨瀏覽器兼容,我們要思考幾個問題:1.如果傳遞一個節點的下標,IE是從0開始計算,W3C從1開始計算,可以通過傳遞獲取下標進行增1減1的操作來進行。2.獨有的功能放棄,為了保證跨瀏覽器。3.只獲取單一節點和節點列表即可,基本可以完成所有的操作。

?跨瀏覽器獲取單一節點

var xml = '<root><user id="5">Lee</user><user id="6">Koko</user></root>'; //定義xml字符串 var xmldom = getXMLDOM(xml); //創建XML DOM對象,接收xml字符串 var jied = selectSingleNode(xmldom,'root/user'); //執行跨瀏覽器獲取單一節點函數 alert(serializeXML(jied)); //序列化節點標簽//跨瀏覽器獲取單一節點,返回單一節點對象 function selectSingleNode(xmlDom, xpath) { //加收兩個參數,參數1XML DOM對象,參數二要查找的標簽路徑var node = null; //初始化if (typeof xmlDom.evaluate != 'undefined') { //判斷XML DOM對象下的evaluate方法不等于undefined,說明支持,就用ie9以下的方式var patten = /\[(\d+)\]/g; //正則var flag = xpath.match(patten); //返回正則匹配到的字符串var num = 0; //初始化if (flag !== null) {num = parseInt(RegExp.$1) + 1;xpath = xpath.replace(patten, '[' + num + ']');}var result = xmlDom.evaluate(xpath, xmlDom, null,XPathResult.FIRST_ORDERED_NODE_TYPE, null);if (result !== null) {node = result.singleNodeValue;}} else if (typeof xmlDom.selectSingleNode != 'undefined') { //w3c方式node = xmlDom.selectSingleNode(xpath);}return node; }//首先,我們需要跨瀏覽器獲取XML DOM function getXMLDOM(xmlStr) { //自定義跨瀏覽器創建xml DOM對象,接收一個參數xml字符串var xmlDom = null; //初始化一個對象if (typeof window.DOMParser != 'undefined') { //判斷DOMParser類型不等于undefined說明支持//創建DOMParser對象,并且創建xml DOM對象xmlDom = (new DOMParser()).parseFromString(xmlStr, 'text/xml');//獲取錯誤信息的parsererror標簽var errors = xmlDom.getElementsByTagName('parsererror');//判斷錯誤信息標簽返回集合長度大于0,說明xml有錯誤if (errors.length > 0) {//創建一個錯誤對象,獲取到第一個錯誤標簽,并且獲取到他的文本內容throw new Error('XML解析錯誤:' + errors[0].firstChild.nodeValue);}//如果不支持DOMParser類型,嘗試IE的方法} else if (typeof window.ActiveXObject != 'undefined') { //判斷ActiveXObject類型不等于undefined說明支持var version = [ //創建一個數組,元素分別為3個xml版本'MSXML2.DOMDocument.6.0','MSXML2.DOMDocument.3.0','MSXML2.DOMDocument'];for (var i = 0; i < version.length; i++) { //根據數組的長度循環次數try {//嘗試著執行每次循環到的xml版本,創建xml對象xmlDom = new ActiveXObject(version[i]);} catch (e) { //如果出錯跳過執行第二次循環//跳過 }}xmlDom.loadXML(xmlStr); //載入xml字符串if (xmlDom.parseError != 0) { //判斷載入xml錯誤返回代碼,如果不等于0說明xml有錯//創建一個錯誤對象,返回錯誤的解釋信息throw new Error('XML解析錯誤:' + xmlDom.parseError.reason);}} else { //如果 上面兩種方式都不支持//創建一個錯誤對象,拋出您所使用的系統或瀏覽器不支持XML DOM!throw new Error('您所使用的系統或瀏覽器不支持XML DOM!');}return xmlDom; //最后返回創建的xmlDOM對象 }//其次,我們還必須跨瀏覽器序列化XML function serializeXML(xmlDom) { //序列化xml函數,接收xmlDOM對象對象var xml = ''; //初始化一個變量等于空字符串if (typeof XMLSerializer != 'undefined') { //判斷XMLSerializer類型,不等于undefined,說明支持序列化//給xml重新賦值,創建XMLSerializer對象,并且使用serializeToString方法序列化xml = (new XMLSerializer()).serializeToString(xmlDom);//如果不支持XMLSerializer類型} else if (typeof xmlDom.xml != 'undefined') { //判斷IE方式xmlDOM對象下的xml屬性是否等于undefined,不等于說明支持//給xml重新賦值,序列化xmlxml = xmlDom.xml;} else { //如果上面兩種都不支持//創建一個錯誤對象,拋出無法解析XML!錯誤信息throw new Error('無法解析XML!');}return xml; //最后返回序列化 }

跨瀏覽器獲取節點集合

var xml = '<root><user id="5">Lee</user><user id="6">Koko</user></root>'; //定義xml字符串 var xmldom = getXMLDOM(xml); //創建XML DOM對象,接收xml字符串 var jied = selectNodes(xmldom,'root/user'); //執行跨瀏覽器獲取集合節點函數 alert(serializeXML(jied[0])); //序列化節點標簽//跨瀏覽器獲取節點集合,返回節點集合 function selectNodes(xmlDom, xpath) { //接收兩個參數,參數1XML DOM對象,參數2要查找的節點標簽路徑var nodes = [];if (typeof xmlDom.evaluate != 'undefined') {var patten = /\[(\d+)\]/g;var flag = xpath.match(patten);var num = 0;if (flag !== null) {num = parseInt(RegExp.$1) + 1;xpath = xpath.replace(patten, '[' + num + ']');}var node = null;var result = xmlDom.evaluate('root/user', xmlDom, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);if (result !== null) {while ((node = result.iterateNext()) !== null) {nodes.push(node);}}} else if (typeof xmlDom.selectNodes != 'undefined') {nodes = xmlDom.selectNodes(xpath);}return nodes; }//首先,我們需要跨瀏覽器獲取XML DOM function getXMLDOM(xmlStr) { //自定義跨瀏覽器創建xml DOM對象,接收一個參數xml字符串var xmlDom = null; //初始化一個對象if (typeof window.DOMParser != 'undefined') { //判斷DOMParser類型不等于undefined說明支持//創建DOMParser對象,并且創建xml DOM對象xmlDom = (new DOMParser()).parseFromString(xmlStr, 'text/xml');//獲取錯誤信息的parsererror標簽var errors = xmlDom.getElementsByTagName('parsererror');//判斷錯誤信息標簽返回集合長度大于0,說明xml有錯誤if (errors.length > 0) {//創建一個錯誤對象,獲取到第一個錯誤標簽,并且獲取到他的文本內容throw new Error('XML解析錯誤:' + errors[0].firstChild.nodeValue);}//如果不支持DOMParser類型,嘗試IE的方法} else if (typeof window.ActiveXObject != 'undefined') { //判斷ActiveXObject類型不等于undefined說明支持var version = [ //創建一個數組,元素分別為3個xml版本'MSXML2.DOMDocument.6.0','MSXML2.DOMDocument.3.0','MSXML2.DOMDocument'];for (var i = 0; i < version.length; i++) { //根據數組的長度循環次數try {//嘗試著執行每次循環到的xml版本,創建xml對象xmlDom = new ActiveXObject(version[i]);} catch (e) { //如果出錯跳過執行第二次循環//跳過 }}xmlDom.loadXML(xmlStr); //載入xml字符串if (xmlDom.parseError != 0) { //判斷載入xml錯誤返回代碼,如果不等于0說明xml有錯//創建一個錯誤對象,返回錯誤的解釋信息throw new Error('XML解析錯誤:' + xmlDom.parseError.reason);}} else { //如果 上面兩種方式都不支持//創建一個錯誤對象,拋出您所使用的系統或瀏覽器不支持XML DOM!throw new Error('您所使用的系統或瀏覽器不支持XML DOM!');}return xmlDom; //最后返回創建的xmlDOM對象 }//其次,我們還必須跨瀏覽器序列化XML function serializeXML(xmlDom) { //序列化xml函數,接收xmlDOM對象對象var xml = ''; //初始化一個變量等于空字符串if (typeof XMLSerializer != 'undefined') { //判斷XMLSerializer類型,不等于undefined,說明支持序列化//給xml重新賦值,創建XMLSerializer對象,并且使用serializeToString方法序列化xml = (new XMLSerializer()).serializeToString(xmlDom);//如果不支持XMLSerializer類型} else if (typeof xmlDom.xml != 'undefined') { //判斷IE方式xmlDOM對象下的xml屬性是否等于undefined,不等于說明支持//給xml重新賦值,序列化xmlxml = xmlDom.xml;} else { //如果上面兩種都不支持//創建一個錯誤對象,拋出無法解析XML!錯誤信息throw new Error('無法解析XML!');}return xml; //最后返回序列化 }

PS:在傳遞xpath路徑時,沒有做驗證判斷是否合法,有興趣的同學可以自行完成。在XML還有一個重要章節是XSLT和EX4,由于在使用頻率的緣故,我們暫且擱置。

轉載于:https://www.cnblogs.com/adc8868/p/6216078.html

總結

以上是生活随笔為你收集整理的第一百二十六节,JavaScript,XPath操作xml节点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

在线国产日韩 | 亚洲精品午夜久久久久久久久久久 | 中文国产字幕在线观看 | 欧美激情综合五月色丁香 | 免费在线观看a v | 啪啪免费视频网站 | 国产香蕉av | 日韩有码网站 | 久久久久久久免费观看 | 久久久久黄色 | 婷婷丁香九月 | 另类老妇性bbwbbw高清 | 亚洲精品中文字幕在线观看 | 99视频在线精品国自产拍免费观看 | 97国产精品久久 | 国产精品一区二区中文字幕 | 在线观看久久久久久 | 国产a视频免费观看 | 91九色视频国产 | 深爱激情综合 | 久久精品国产免费 | 国产免费观看av | 欧洲视频一区 | 亚洲视频每日更新 | 在线免费观看视频a | 日本不卡一区二区三区在线观看 | 91精品国产一区二区在线观看 | 欧美性粗大hdvideo | 国产精品久久久久久久久久免费看 | 天天操天天色天天射 | 深爱开心激情网 | 五月婷婷中文 | 人人爽爽人人 | 91人人澡| 国产成人免费av电影 | 日韩在线观看小视频 | 国际精品久久久久 | 午夜精品久久久久久久99热影院 | 久久永久免费视频 | 久久综合中文字幕 | 性色av香蕉一区二区 | 成人久久18免费 | 国产欧美中文字幕 | 亚洲情影院 | 亚洲成a人片77777潘金莲 | 亚洲 欧美 91| 亚洲精品www. | 午夜久久久久久久久久影院 | 永久黄网站色视频免费观看w | 国产精品一区二区三区在线免费观看 | 激情五月婷婷综合 | 国产区精品区 | 激情久久一区二区三区 | 色综合久久久久 | 久久夜靖品 | 国产伦精品一区二区三区照片91 | 精品国产成人 | 中文字幕一区二区三区视频 | 婷婷资源站| av资源在线看 | 亚洲精品国产麻豆 | 久久久精品高清 | 久久在线免费视频 | 一区二区三区免费 | 深爱激情五月网 | 欧美国产大片 | 91黄站| 婷婷在线视频观看 | 亚洲乱码中文字幕综合 | 日韩网站在线播放 | 国产精品99久久久精品免费观看 | 超碰97人人在线 | 看片网站黄 | 色综合久久综合中文综合网 | 久久99热国产 | 在线观看国产www | 91精品网站在线观看 | 在线激情小视频 | 99精品久久精品一区二区 | 天天视频色 | 午夜精品av | 在线观看视频在线 | 91mv.cool在线观看 | 毛片网站在线 | 免费久久网站 | 国产精品99免视看9 国产精品毛片一区视频 | 亚洲另类视频在线 | 色香蕉视频| 国产黄在线播放 | 欧美精品免费一区二区 | 69国产精品视频 | 国产精品精品国产色婷婷 | 国产极品尤物在线 | 日日狠狠| 九七在线视频 | 激情丁香5月 | 美女又爽又黄 | 久久综合久久综合这里只有精品 | 久久人人97超碰精品888 | 亚洲人xxx | 亚洲精品久久久久中文字幕二区 | 五月天综合网站 | 91最新网址在线观看 | 欧美色图亚洲图片 | 国产不卡视频 | 日韩成人在线一区二区 | 91黄色免费网站 | 色婷婷www| 国产精品视频地址 | 最新午夜 | 少妇bbr搡bbb搡bbb | 亚洲久草在线 | 国产视频在线观看一区二区 | 欧美黑人巨大xxxxx | 久久第四色 | 人人爱爱| 国产在线观看中文字幕 | 97超视频在线观看 | 91视频 - x99av| 午夜美女福利直播 | 国产精品福利在线播放 | 8x8x在线观看视频 | 亚洲综合网 | 成人免费看黄 | 天堂av观看| 人人爽人人澡人人添人人人人 | 精产嫩模国品一二三区 | 国产又粗又猛又色又黄视频 | 午夜精品影院 | 麻豆av电影 | 婷婷去俺也去六月色 | 精品爱爱| 久久成人国产 | 精品亚洲国产视频 | 又黄又爽又色无遮挡免费 | 国产女做a爱免费视频 | 久久成人国产精品入口 | 性色av免费看 | 91九色网站 | 亚洲国内精品 | 国产色影院 | 欧美大码xxxx | 四虎最新域名 | 日韩视频一区二区在线 | 日韩网站中文字幕 | 色瓜| 麻豆一区二区三区视频 | 久久中国精品 | 久久久久电影 | 久久在线看| 国产精品免费av | 亚洲区视频在线观看 | 亚洲精品久久久久久中文传媒 | 草免费视频 | 国产精品96久久久久久吹潮 | 久草在线观看视频免费 | 97超碰资源 | 欧美日韩国产一二三区 | 黄色特一级 | 亚洲精品黄色在线观看 | 欧美日韩在线观看一区 | 麻豆91在线播放 | 人人干人人草 | 日本精品视频在线观看 | 亚洲精品97 | 国产伦精品一区二区三区… | 国产精品a成v人在线播放 | 超碰97人人爱 | 天天干夜夜操视频 | 色综合在 | 91在线观看欧美日韩 | 欧美一区二区精品在线 | 精品国产一区二区三区免费 | 999成人 | 天天干天天操天天拍 | 国内免费的中文字幕 | 国产一区自拍视频 | 我要看黄色一级片 | 国产男男gay做爰 | 久久免费视屏 | 视频在线观看亚洲 | 高潮毛片无遮挡高清免费 | 日本久久免费电影 | 日韩在线不卡av | 娇妻呻吟一区二区三区 | 久久久片| 婷婷丁香综合 | 日韩久久精品一区二区三区下载 | 在线视频日韩精品 | 欧洲亚洲精品 | 久久久久亚洲国产精品 | 激情在线免费视频 | 999电影免费在线观看 | 国产三级av在线 | 一本之道乱码区 | 丁香色综合 | 超碰97在线人人 | 中文字幕在线视频一区二区 | 最近免费在线观看 | 最近中文国产在线视频 | 亚洲成人在线免费 | 免费性网站 | 日韩a免费 | 国产在线国偷精品产拍 | 国产美女视频免费观看的网站 | 国产免费观看久久黄 | 成人黄色短片 | 免费看黄20分钟 | 天天综合色网 | 中文在线资源 | 午夜私人影院久久久久 | 美女视频免费一区二区 | 一级免费黄视频 | 亚洲精品国产成人av在线 | 久久国产精品一区二区三区 | 尤物97国产精品久久精品国产 | 手机色站| 国产日韩中文字幕 | 亚洲自拍偷拍色图 | 成片人卡1卡2卡3手机免费看 | 精品91久久久久 | 亚洲三级精品 | 免费热情视频 | 中文字幕亚洲不卡 | aa一级片| 国产理论一区二区三区 | 在线观看黄色国产 | 亚洲国产精品激情在线观看 | 毛片网在线观看 | 国产日韩精品在线观看 | 999免费视频 | 免费av网站在线看 | 国产伦精品一区二区三区四区视频 | 久久亚洲影视 | 免费在线播放av电影 | 久久久久久久久久久久久国产精品 | .国产精品成人自产拍在线观看6 | 久久精品国产第一区二区三区 | 69国产成人综合久久精品欧美 | 国产精在线 | 亚洲国产婷婷 | 国产精品一区二区三区视频免费 | 亚洲精品99久久久久中文字幕 | 成年人免费在线观看 | 国产 视频 久久 | 亚洲国产成人在线播放 | 久久综合狠狠综合久久狠狠色综合 | 国产精品免费在线播放 | 黄色免费电影网站 | 久草在线久草在线2 | 久久精品一区 | 免费在线电影网址大全 | 一区二区三区中文字幕在线观看 | 人人插人人搞 | 国产成人一级电影 | 特级aaa毛片 | 亚洲视频每日更新 | 国产精品永久久久久久久www | 亚洲精品在线免费播放 | 久草久草在线观看 | 91久久国产露脸精品国产闺蜜 | 91九色蝌蚪国产 | 精品久久久久久亚洲综合网站 | 五月婷婷欧美 | 国产精品亚洲片在线播放 | 97超碰在线久草超碰在线观看 | 99精品热| www.亚洲精品在线 | 麻豆精品国产传媒 | 超碰国产97 | 99热手机在线观看 | 国产高清在线免费视频 | 日韩免费一区 | 日韩在线大片 | 丁香在线观看完整电影视频 | 亚洲免费黄色 | 久久 在线 | 亚洲va天堂va欧美ⅴa在线 | 91电影福利 | av网站手机在线观看 | 狠狠久久伊人 | 久久这里只有精品9 | 在线精品亚洲一区二区 | 欧美一级片免费 | 日本精品久久久久影院 | 黄色特级毛片 | 精品国产免费一区二区三区五区 | 色婷婷久久一区二区 | 成人av高清| 亚洲国产成人精品在线观看 | 日韩有色| 国产一区在线视频观看 | 亚洲日本欧美在线 | 色99之美女主播在线视频 | 国产黄色成人av | 日韩影视在线观看 | 91丨精品丨蝌蚪丨白丝jk | 亚洲jizzjizz日本少妇 | 久久久精品福利视频 | 国产69精品久久app免费版 | 日韩亚洲在线 | 久久精品一区二区三 | 国产免费一区二区三区最新6 | 国产精品日韩欧美一区二区 | 国产日产精品一区二区三区四区 | 久久精品欧美日韩精品 | 992tv在线观看 | 91成人看片 | 成人免费网站视频 | 日本成人免费在线观看 | av888.com| 国产色久 | 久草视频在线免费播放 | 91女神的呻吟细腰翘臀美女 | 色中色亚洲 | 亚洲国产视频a | 日韩欧美电影网 | av大全在线免费观看 | 99欧美| av中文字幕在线电影 | 国产精品第二页 | 久久精品欧美日韩精品 | 日韩精品一区二区三区电影 | 色婷婷成人| 日本精品一区二区三区在线播放视频 | 欧美一区影院 | 九草在线视频 | av电影在线观看 | 欧美在线观看视频一区二区三区 | 亚洲视频免费在线观看 | 91福利小视频 | 狠狠色丁香九九婷婷综合五月 | 精品免费视频 | 亚洲天堂网视频 | 免费电影播放 | av成年人电影 | 久久艹99| 欧美福利视频一区 | 日韩激情视频在线 | 久久蜜桃av | 午夜精品一区二区三区视频免费看 | 99久久精品国产免费看不卡 | 亚洲在线精品视频 | 天天综合网入口 | 成人超碰在线 | 色噜噜在线观看 | 在线免费观看黄网站 | 97在线视频网站 | 日韩二区三区在线 | 亚洲精品乱码久久久久久 | 亚洲在线精品 | 国产日韩中文在线 | 久久免费国产电影 | 国产激情小视频在线观看 | 欧美另类美少妇69xxxx | 免费av大片 | 欧美va在线观看 | 狠狠干天天干 | 免费成人在线视频网站 | 激情九九 | 天天天干天天射天天天操 | 九九热精品国产 | 亚洲精品国产精品乱码不99热 | 国产亲近乱来精品 | 草久久av | 日韩羞羞 | 国产精品久久久久久av | 91成人小视频| 国产最新视频在线 | 九热在线| 国产午夜精品一区 | 91精品国产福利在线观看 | 在线不卡视频 | 四虎成人网 | 久久久午夜精品理论片中文字幕 | 久在线| 国产精品日韩欧美 | 99国产精品久久久久老师 | 精品国产一区二区三区久久 | 草莓视频在线观看免费观看 | 日韩乱色精品一区二区 | 一区二区三区电影在线播 | 精品人人人 | 国产女人40精品一区毛片视频 | 激情av网址 | 久久你懂得 | 99久久精品久久亚洲精品 | 日日摸日日添日日躁av | 黄色天堂在线观看 | 成 人 黄 色 视频免费播放 | 91九色在线视频观看 | 夜夜嗨av色一区二区不卡 | 亚洲黄网站 | 九色视频网址 | 韩国精品视频在线观看 | 黄影院 | 丁香六月在线 | 久久99精品久久久久久三级 | 国产一区二区三精品久久久无广告 | 五月婷婷在线观看 | 久久午夜色播影院免费高清 | 成人久久久久久久久久 | 高清视频一区 | 99热国产在线中文 | 中文字幕在线观看第三页 | 国产1区在线观看 | 中文字幕亚洲五码 | 亚洲第一香蕉视频 | 4438全国亚洲精品观看视频 | 激情中文字幕 | 婷色在线 | 欧美三人交 | 久久一区二区免费视频 | 色婷婷综合久久久 | 五月婷婷激情网 | 夜夜操天天操 | 日本精品视频免费观看 | 国产九九九视频 | av三级在线免费观看 | 亚洲精品综合欧美二区变态 | 国产午夜剧场 | 亚洲理论片 | 中文乱码视频在线观看 | 国产高清 不卡 | 久久男人中文字幕资源站 | 婷婷久久一区二区三区 | 国产精品第二页 | 成人一区二区三区在线观看 | 国产精品中文字幕在线观看 | 日本系列中文字幕 | 久久久久亚洲精品中文字幕 | 一区二区伦理 | 在线视频欧美日韩 | 99久久这里有精品 | 91在线91 | 亚洲欧美视频在线播放 | 欧美综合久久 | 日本在线视频一区二区三区 | 成人在线视频论坛 | 五月花丁香婷婷 | 欧日韩在线视频 | 草久在线| 奇米网8888 | 亚洲综合色激情五月 | 99久久精品无码一区二区毛片 | 久精品一区 | 天天干天天射天天爽 | 81精品国产乱码久久久久久 | 在线看一区 | 久久精品99国产精品酒店日本 | 永久中文字幕 | 亚洲精品videossex少妇 | 久久免费成人精品视频 | 精品久久福利 | 天天综合成人网 | 久草在线免费色站 | 国产私拍在线 | 九色porny真实丨国产18 | 国产精品av久久久久久无 | 国产在线观看你懂得 | 日韩欧美极品 | 国产黄大片在线观看 | 日韩欧美69 | 久久成人国产精品一区二区 | 国产成人黄色网址 | 午夜免费福利视频 | 日韩a在线 | 蜜臀av网址 | 国产综合精品一区二区三区 | 国产在线最新 | av电影中文字幕在线观看 | 91精品国产欧美一区二区成人 | 国产片免费在线观看视频 | 日韩精品视频在线观看网址 | 国产精品丝袜在线 | 国产一区在线免费观看视频 | 激情影音先锋 | 精品999在线观看 | 99热这里只有精品在线观看 | 国产精品久久网站 | 亚洲伦理一区 | 在线v片免费观看视频 | 久久久国产在线视频 | 激情视频免费在线观看 | 久久成人一区 | 午夜精品久久一牛影视 | 国产精品久久伊人 | 天天插天天射 | 成人免费视频网址 | 国产免码va在线观看免费 | 亚洲一区 av | 成年人天堂com| 久久99精品热在线观看 | 在线导航福利 | 国产精品网站一区二区三区 | 91在线www| 看片在线亚洲 | 欧美日韩超碰 | 国产美女在线免费观看 | a在线免费观看视频 | 国产成人免费观看久久久 | 久久成人国产精品免费软件 | 国产中文字幕一区 | 激情欧美国产 | 免费看片成人 | 国产在线欧美 | 最近日本中文字幕a | 懂色av懂色av粉嫩av分享吧 | 在线观看韩日电影免费 | 久草在线免费在线观看 | 久久精品欧美 | 久草在线最新视频 | 9在线观看免费高清完整 | 日本久久综合网 | 免费看片日韩 | 天天干,天天操 | 人人干网站 | 一区二区精品在线 | 婷婷电影网| 精品国产123 | 麻豆传媒视频在线免费观看 | 丁香婷婷激情国产高清秒播 | 久久看毛片 | 97在线观看免费观看高清 | 成人精品视频 | 中文字幕在线视频精品 | 亚洲欧美日韩国产一区二区 | 中文字幕第 | 黄污在线看 | 欧美日韩一区二区在线观看 | 精品久久久久久久久久久院品网 | 91爱在线 | 韩国精品一区二区三区六区色诱 | 亚洲播放一区 | 午夜精品久久久久久久久久久久久久 | 91精品久久久久久综合乱菊 | 国产麻豆精品久久 | 91精品免费视频 | 国产精品系列在线观看 | 激情五月在线观看 | 日韩有码专区 | 日韩黄色大片在线观看 | 高清av在线免费观看 | 狠狠狠狠狠狠操 | 国产在线中文 | 五月婷婷六月丁香在线观看 | 国产精品美女在线观看 | 久久夜靖品| 超碰公开在线观看 | 91精品视频一区 | www..com黄色片 | 国产精品久久99综合免费观看尤物 | 日韩视频免费 | 偷拍视频一区 | 成人性生交大片免费观看网站 | av中文字幕日韩 | 久久久久久久久网站 | 黄色软件视频大全免费下载 | 精品国产乱子伦一区二区 | 国产精品丝袜 | 国产美女在线观看 | 91麻豆精品91久久久久同性 | 91成人看片 | 新版资源中文在线观看 | 久久久久久高潮国产精品视 | 色婷婷综合激情 | 福利视频 | 黄色一级大片在线免费看国产一 | 久久久久久久久久免费 | 色小说在线 | 国产韩国精品一区二区三区 | 亚洲午夜精品久久久久久久久久久久 | 99久久日韩精品视频免费在线观看 | 中文字幕在线观看网站 | 在线国产能看的 | 91精品一区二区三区蜜桃 | 午夜视频在线观看一区二区 | www.在线看片.com | 久久精品欧美日韩精品 | 国产一在线精品一区在线观看 | 欧美激情亚洲综合 | 91片黄在线观 | 亚洲三级性片 | 国产视频一区在线 | 久久99国产视频 | 久草97| 成人a级网站 | av亚洲产国偷v产偷v自拍小说 | 国产在线视频一区二区 | 国产精品毛片一区视频 | 国产一区二区在线观看视频 | 国产真实精品久久二三区 | 久久久久久久久久久成人 | 国产不卡在线看 | www.com黄| 国产日产av| 国产一级免费片 | 国产精品久久久久久一区二区三区 | 国产精品99久久久久人中文网介绍 | 日韩超碰 | 欧美日韩三级在线观看 | 国产精品久久久久久超碰 | 日韩欧美网站 | 免费看污片 | 在线免费av网站 | 国产裸体无遮挡 | av一级免费 | 午夜精品影院 | 欧美成人tv | 久久午夜精品 | 正在播放五月婷婷狠狠干 | 久久精品女人毛片国产 | 又黄又爽又刺激的视频 | 天天玩天天干 | 亚洲综合射 | 在线观看黄色小视频 | www.人人草 | 亚洲精品视频在线播放 | 国产黄大片在线观看 | 91九色视频在线播放 | 天天色天天射天天操 | 亚洲男男gaygayxxxgv | 久久 一区 | 91亚洲在线观看 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 国产一区在线免费观看 | 亚洲综合在线发布 | 四虎影视成人永久免费观看亚洲欧美 | 国产伦理久久 | 亚洲国产欧美在线人成大黄瓜 | 日韩爱爱网站 | 天天综合91 | 国产成人777777 | 在线午夜电影神马影院 | 成人网在线免费视频 | 香蕉蜜桃视频 | 国产精品视频区 | 精品国产精品久久一区免费式 | 在线亚洲激情 | 麻豆一精品传二传媒短视频 | 黄色高清视频在线观看 | 久久久久久中文字幕 | 午夜视频二区 | 国产免费av一区二区三区 | 奇米影视8888在线观看大全免费 | 久久久www成人免费精品 | 欧美精品亚洲精品 | 日日干天天爽 | 综合在线亚洲 | 超碰97成人 | 欧美日韩不卡一区二区 | 国产高清在线a视频大全 | 狠狠干我| 日韩高清在线看 | 欧洲色综合 | 亚洲精品成人 | 国产精品麻豆果冻传媒在线播放 | 国产一区二区在线观看视频 | 日韩在线免费视频观看 | 色 中文字幕 | 日本h在线播放 | 国产精品永久久久久久久久久 | 久久99亚洲精品久久 | 久久成人高清 | 欧美一二区视频 | 久久精品精品 | 国产精品成人久久久 | 亚洲天堂精品视频在线观看 | 国产亚洲视频系列 | 免费在线观看av的网站 | 久久综合久久综合久久 | 久久99精品热在线观看 | 免费a级黄色毛片 | 日日日日干| 国产在线播放观看 | 亚洲 欧美 变态 国产 另类 | 日本黄色免费播放 | 成人在线免费看视频 | 天天综合网 天天 | 香蕉久久久久 | 日本中文字幕电影在线免费观看 | 日韩精品无 | 亚洲成人精品国产 | 国产色女 | 中文字幕在线国产精品 | 日日爽天天操 | 成人国产精品一区 | 婷婷六月天综合 | 黄色的片子| 奇米7777狠狠狠琪琪视频 | av福利在线播放 | 中文字幕av免费在线观看 | 精品国产福利在线 | 992tv在线观看| 毛片二区| 国产毛片久久久 | 免费三级黄色片 | 久久综合九色综合97_ 久久久 | 国产99久久九九精品免费 | 就要干b| 欧美日韩中文在线观看 | 日本精品一区二区 | 国产传媒一区在线 | 久久久久久久看片 | 欧美成人精品三级在线观看播放 | 91精品国产92久久久久 | 日本中文字幕在线一区 | av电影免费在线 | 97成人免费 | 成人a视频在线观看 | 国产色网| 久久精品专区 | 国产精品原创视频 | 亚洲黄色激情小说 | 六月色 | 麻豆视传媒官网免费观看 | 97手机电影网 | 欧美日本一二三 | 亚洲专区在线 | 99久久一区| 国产视频一 | www.色午夜 | 99c视频高清免费观看 | 国内精品在线一区 | 中文字幕成人在线 | 日韩欧美在线高清 | 黄色三级免费网址 | 国产偷v国产偷∨精品视频 在线草 | 久久99精品久久只有精品 | 四虎www com| 精品专区一区二区 | 国产精品久久久久久久久大全 | 69亚洲乱| 六月丁香在线观看 | 狠狠插狠狠操 | 日韩欧美在线中文字幕 | 中午字幕在线观看 | 国产精品18久久久久vr手机版特色 | 中文字幕免费成人 | 国产精品美女久久久久久 | 免费av在线播放 | 亚洲精品免费在线视频 | 欧美一级专区免费大片 | 激情欧美一区二区免费视频 | 一区二区三区日韩在线观看 | 日韩激情一二三区 | 成年人免费观看国产 | 天天人人综合 | 91手机视频 | 婷婷久久综合九色综合 | 国内久久久久 | 91精品国产麻豆 | 夜夜夜影院 | 91网页版在线观看 | 日韩在线观看影院 | 国产午夜精品一区二区三区 | 色99网 | 热久久最新地址 | 免费美女av | 黄色片网站大全 | 美女网站久久 | 美女视频永久黄网站免费观看国产 | 五月天激情视频在线观看 | 国产一级黄色片免费看 | 美女久久99| 久久久蜜桃一区二区 | 日日夜夜中文字幕 | 三级免费黄色 | 婷婷伊人综合亚洲综合网 | 国产人成在线视频 | 黄色国产在线 | 男女男视频 | 日韩网页 | 国产精品自产拍在线观看网站 | 国产精品午夜在线 | 精品国精品自拍自在线 | 在线国产能看的 | 日韩av男人的天堂 | 久久国产热视频 | 国产在线高清 | 久久精品国产免费看久久精品 | 成人免费在线观看入口 | 欧美日韩一级在线 | 欧美成人精品三级在线观看播放 | 国产欧美精品在线观看 | 成人avav| 综合久久网站 | 狠狠操综合 | 欧美一区二区伦理片 | av免费黄色| 色综合天天综合 | 亚洲欧美在线视频免费 | 中文字幕日本在线观看 | 日韩大片在线免费观看 | 99热这里有| 我要色综合天天 | 国产99久久久精品视频 | av在线在线 | 一性一交视频 | 天天鲁一鲁摸一摸爽一爽 | 99亚洲精品在线 | 丝袜制服综合网 | 国产精品久久久久一区二区国产 | 国产综合视频在线观看 | 狠狠色综合欧美激情 | 天天躁日日躁狠狠躁 | 99久久精品无免国产免费 | 天天天干夜夜夜操 | 午夜精品久久久久久中宇69 | 久久免费中文视频 | 色播五月激情五月 | 国产福利免费看 | 欧美日韩精品区 | 日本超碰在线 | 91福利视频久久久久 | 日韩中文在线电影 | 国产一区二区手机在线观看 | 亚洲最新av网站 | 成人va天堂| 天天色天天色 | 婷婷色综合网 | 日韩欧美高清一区二区三区 | 成人av免费网站 | 999免费视频 | 国产日韩中文字幕在线 | av成人动漫在线观看 | 欧美久久久一区二区三区 | 日韩精品在线免费观看 | 国产亚洲精品福利 | 亚洲国产大片 | 久久伊人91 | 日本丶国产丶欧美色综合 | 免费观看国产视频 | 日日夜夜精品免费 | 精品国产电影一区 | 欧美了一区在线观看 | 国产精品一区二区久久国产 | 丁香一区二区 | av黄色免费在线观看 | 日韩日韩日韩日韩 | 777奇米四色 | 欧美日韩一区二区在线 | 91精品国产九九九久久久亚洲 | 丁香一区二区 | 国产福利精品在线观看 | 日韩精品在线免费观看 | 国内精品亚洲 | 亚洲欧美视频在线播放 | 久久久影片 | 欧美性生活免费 | 成人av.com | 国产精品黄色在线观看 | 国产精品免费大片视频 | 色婷婷成人网 | 亚洲最新毛片 | 黄色小说在线观看视频 | 亚洲japanese制服美女 | 天天插视频 | 午夜av一区二区三区 | 一区二区三区三区在线 | 五月婷香| 久草免费色站 | 国产一级片在线播放 | 国产成人在线播放 | 国产男女无遮挡猛进猛出在线观看 | 久久久久免费精品国产小说色大师 | 99久久精品视频免费 | 在线免费观看羞羞视频 | 国产专区视频在线 | 美女精品国产 | 久久爱992xxoo| 亚洲国产日韩av | 中文伊人 | 热久久国产 | 91tv国产成人福利 | 最近中文字幕完整高清 | 婷婷日 | 国产麻豆精品在线观看 | 久久看片 | 亚洲视频资源在线 | 亚洲影视九九影院在线观看 | 91人人爽人人爽人人精88v | 久久精品男人的天堂 | 色视频 在线 | 国产精品综合在线观看 | 午夜精品一区二区三区在线视频 | 天天操天天射天天操 | 欧美日韩在线观看一区 | 高清av中文字幕 | 99婷婷狠狠成为人免费视频 | 国产一区在线观看免费 | 香蕉视频国产在线观看 | 亚洲日韩精品欧美一区二区 | 操操操综合 | 国产一区欧美在线 | 成人小视频在线免费观看 | 婷婷色亚洲 | 欧美综合久久 | 天天摸天天弄 | 韩日av在线 | 国产玖玖精品视频 | 国产精品免费久久久久久久久久中文 | 国产麻豆视频在线观看 | 天天天色综合a | 西西444www大胆无视频 | 色网免费观看 | 久久久资源网 | 欧美成人高清 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 日韩a在线 | 欧洲精品视频一区 | 国产精品热 | 久久论理 | 国产精彩视频一区二区 | 黄www在线观看| 日韩特黄一级欧美毛片特黄 | 欧美日韩破处 | 国产99黄| 99久久爱| 丁香色婷 | 久久精品中文字幕少妇 | 五月天婷婷视频 | 激情视频一区二区三区 | 91精品在线播放 | 日b视频国产 | av成人动漫 | 黄色aaa级片| 成人四虎影院 | 五月婷婷中文字幕 | 成人资源在线播放 | 又紧又大又爽精品一区二区 | 日韩av一区二区在线 | 国产高清精 | 在线观看黄色av | 国产亚洲欧美在线视频 | 精品五月天 | 成人午夜电影在线播放 | 亚洲午夜久久久影院 | 国产特级毛片aaaaaa毛片 | 香蕉视频导航 | 日韩国产精品毛片 | 日日久视频 | 精品国产成人在线 | 免费看的黄色网 | 国内精品久久久久久久久久久 | 天天天综合网 | 美女中文字幕 | 久久久久久久久久久久久影院 | 91精品国产99久久久久久红楼 | 国产精品久久久av久久久 | 午夜在线免费观看视频 | 欧美另类网站 | 高潮久久久 | 午夜av不卡 | 欧美日韩国产精品一区二区三区 | 五月婷在线 | 日日操操操| 久草电影在线观看 | 国产精品久久久久久av | 国产精品久久久久久婷婷天堂 | 久久97超碰 | 色午夜影院 | 日韩婷婷 | 亚洲最大成人免费网站 | 日韩久久久久久久 | 国产高清av在线播放 | 国产91在线 | 美洲 | 不卡的av | 天天爽网站 | 日韩午夜在线播放 | 18做爰免费视频网站 | 91精品国产91久久久久福利 | 亚洲精品一区二区18漫画 | 国产欧美精品一区二区三区四区 | 99久热在线精品视频成人一区 | 六月丁香久久 | 国产精品资源网 | 娇妻呻吟一区二区三区 | 精品在线免费视频 | 日韩视频一区二区在线观看 | 人人干狠狠干 | 成人免费共享视频 | 九色精品 | www日韩在线观看 | 欧美性生活大片 | 天天操天天操 | 麻豆久久一区二区 | 在线成人av | 一级免费黄色 | 欧美91精品久久久久国产性生爱 | 国内外成人免费在线视频 | 色a网 | 日韩精品免费专区 | 成人毛片一区二区三区 | 国产一级不卡视频 | 亚洲永久精品在线观看 | 日韩二区三区在线观看 | 久久视频国产精品免费视频在线 |