JS—XPath

XPath是設(shè)計用來在DOM文檔中查找節(jié)點的一種手段秧骑,因為對于xml而言,他查找節(jié)點是采用標(biāo)準(zhǔn)dom的方法蠕蚜,比較繁雜尚洽,所以XPath對于XML處理很重要。但是靶累,在DOM3級才首次實現(xiàn)了這個推薦不標(biāo)準(zhǔn)腺毫。IE8及以前采用IE特有的方法。

  • IE中的Xpath
  • 基本方式
    在IE8之前的瀏覽器挣柬,XPath是采用內(nèi)置基于ActiveX的XML DOM文檔對象實現(xiàn)的潮酒,在每一個節(jié)點上提供了兩個方法:selectSingleNode()和selectNodes()
    這兩個方法都會接受一個Xpath模式(也就是查找路徑)。
    var xmlDom=getXMLDOM("<root><user id='5'>doo</user><user id='6'>Lee</user></root>");
    var node=xmlDom.selectSingleNode("root/user");
    alert(node.tagName)//user
    var nodes=xmlDom.selectNodes("root/user");
    alert(nodes.length)//2
    特點:
    1邪蛔、selectSingleNode()被用來查找單一節(jié)點急黎。
    2、selectNodes()被用來查找符合路徑的一個nodelist店溢。
    3、xmldom不僅是調(diào)用這兩個方法的對象委乌,也是參數(shù)路徑的上下文節(jié)點床牧。指向xml DOM對象,是root的上一層節(jié)點遭贸。類似于html中的document對象戈咳。注意:在使用上下文節(jié)點時,要與路徑配合好
    var node=xmlDom.documentElement.selectSingleNode("user");
    4、使用selectSingleNode()查找的單一節(jié)點著蛙,其實是同一路徑下節(jié)點的第一個删铃。
  • 常用語法
    【查找同一路徑下的某個節(jié)點】
    var node=xmlDom.selectSingleNode("root/user[1]");
    【獲取節(jié)點內(nèi)的值】
    var node=xmlDom.selectSingleNode("root/user/text()");
    alert(node.nodeValue);
    【不關(guān)心層次查詢】
    查找的是xml文檔內(nèi)的user節(jié)點,不關(guān)心她在怎樣的上下文中踏堡,只要有就可以
    var node=xmlDom.selectSingleNode("http://user");
    是在root下不關(guān)心層次查找user
    var node=xmlDom.selectSingleNode("root//user");
    【查找屬性】
    var node=xmlDom.selectSingleNode("root/user[@id='6']");
  • DOM3中的Xpath
    規(guī)定了兩個重要類型XpathEvaluator和XpathResult猎唁。
    • 獲取單一節(jié)點
      【方法1】
      var eva=new XPathEvaluator();
      var result=eva.evaluate('root/user',xmlDom,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);
      if(result!=null){
      alert(serializeXML(result.singleNodeValue));
      }
      特點:
      1、首先利用XPathEvaluator顷蟆,創(chuàng)造一個實例诫隅,然后調(diào)用該實例的evaluate方法,該方法可以根據(jù)參數(shù)返回節(jié)點情況或節(jié)點信息帐偎。
      2逐纬、為該方法傳遞5個參數(shù),(XPath表達(dá)式削樊,上下文節(jié)點豁生,命名空間求解器(一般null),返回的結(jié)果類型漫贞,保存結(jié)果的XPathResult對象(null))
      3甸箱、返回的結(jié)果類型有很多種,最常用的一個是:返回匹配的節(jié)點集合绕辖,另一個是:返回只包含一個節(jié)點的節(jié)點集合摇肌。
      單一節(jié)點:XPathResult.FIRST_ORDERED_NODE_TYPE
      節(jié)點集合:XPathResult.ORDERED_NODE_ITERATOR_TYPE
      4、.singleNodeValue可以通過結(jié)果的這個屬性來返回匹配節(jié)點
      【方法2】
      省去創(chuàng)建XPathEvaluator對象仪际,而是直接調(diào)用xmlDom對象的evaluate方法围小。
    • 獲取節(jié)點集合
      var eva=new XPathEvaluator();
      var result=eva.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[1]));
      【特點】
      1、可以通過結(jié)果的.iterateNext()這個方法返回遍歷節(jié)點對象树碱,
      2肯适、通過while循環(huán),將節(jié)點集合放到一個數(shù)組中成榜。

跨瀏覽器方法

  • 思考:
    1框舔、XPath中,查找同一個路徑下的某個節(jié)點赎婚,IE是從0開始刘绣,DOM3是從1開始
    2、dom3獨(dú)有的功能放棄挣输,為了保證跨瀏覽器
    3纬凤、只獲取單一節(jié)點與節(jié)點列表即可,基本可以完成所有操作撩嚼。
  • 方法
    //跨瀏覽器單一節(jié)點
    function selectSingleNode(xmlDom,xpath){
    var node=null;
    if(typeof xmlDom.evaluate!='undefined'){//DOM3
    var pattern=/[(\d+)]/;
    var flag=xpath.match(pattern);
    var num=0;
    if(flag!=null){
    num=parseInt(RegExp.$1)+1;
    xpath=xpath.replace(pattern,'['+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'){//IE
    node=xmlDom.selectSingleNode(xpath);
    }
    return node;
    }
    //跨瀏覽器節(jié)點集合
    function selectNodes(xmlDom,xpath){
    var nodes=[];
    if(typeof xmlDom.evaluate!='undefined'){//DOM3
    var pattern=/[(\d+)]/;
    var flag=xpath.match(pattern);
    var num=0;
    if(flag!=null){
    num=parseInt(RegExp.$1)+1;
    xpath=xpath.replace(pattern,'['+num+']')
    }
    var result=xmlDom.evaluate(xpath,xmlDom,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);
    if(result!=null){
    var node=null;
    while((node=result.iterateNext())!=null){
    nodes.push(node);
    }
    }
    }else if(typeof xmlDom.selectSingleNode!='undefined'){//IE
    nodes=xmlDom.selectNodes(xpath);
    }
    return nodes;
    }
    var node=selectSingleNode(xmlDom,'root/user[0]')
    var nodes=selectNodes(xmlDom,'root/user')
    alert(serializeXML(nodes[1]))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末停士,一起剝皮案震驚了整個濱河市挖帘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恋技,老刑警劉巖拇舀,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蜻底,居然都是意外死亡骄崩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門朱躺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刁赖,“玉大人,你說我怎么就攤上這事长搀∮畛冢” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵源请,是天一觀的道長枪芒。 經(jīng)常有香客問我,道長谁尸,這世上最難降的妖魔是什么舅踪? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮良蛮,結(jié)果婚禮上抽碌,老公的妹妹穿的比我還像新娘。我一直安慰自己决瞳,他們只是感情好货徙,可當(dāng)我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著皮胡,像睡著了一般痴颊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屡贺,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天蠢棱,我揣著相機(jī)與錄音,去河邊找鬼甩栈。 笑死泻仙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的量没。 我是一名探鬼主播玉转,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼允蜈!你這毒婦竟也來了冤吨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤饶套,失蹤者是張志新(化名)和其女友劉穎漩蟆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妓蛮,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怠李,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛤克。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捺癞。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖构挤,靈堂內(nèi)的尸體忽然破棺而出髓介,到底是詐尸還是另有隱情,我是刑警寧澤筋现,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布唐础,位于F島的核電站,受9級特大地震影響矾飞,放射性物質(zhì)發(fā)生泄漏一膨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一洒沦、第九天 我趴在偏房一處隱蔽的房頂上張望豹绪。 院中可真熱鬧,春花似錦申眼、人聲如沸瞒津。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仲智。三九已至,卻和暖如春姻氨,著一層夾襖步出監(jiān)牢的瞬間钓辆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工肴焊, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留前联,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓娶眷,卻偏偏與公主長得像似嗤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子届宠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗烁落。 張土汪:刷leetcod...
    土汪閱讀 12,738評論 0 33
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理乘粒,服務(wù)發(fā)現(xiàn),斷路器伤塌,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 參考兩篇其他bolg總結(jié)的二叉樹:https://github.com/xy7313/lintcode/blob/...
    暗黑破壞球嘿哈閱讀 2,348評論 0 1
  • 事情發(fā)生在前幾天上班路上灯萍,早上掌上公交報錯公交到站時間,導(dǎo)致我錯過公交車點每聪,于是我邊走路邊招手尋找路上的出租車旦棉,說...
    juliareal閱讀 210評論 0 0
  • 安先生: 你好!最終決定在離開成都之前药薯,寫封信給你绑洛。 春華秋實,一個輪回童本,倏忽之間真屯。 如往常的每學(xué)期照常旅行一樣,...
    好音閱讀 329評論 0 1