posts - 165, comments - 198, trackbacks - 0, articles - 1
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          xpath javascript

          Posted on 2008-09-24 19:57 G_G 閱讀(514) 評(píng)論(0)  編輯  收藏

          function trim(str){ return str.replace(/(^\s*)|(\s*$)/g,""); }

          function recursiveNodes(array,dom,layer){
          ? if( layer==0 ) return ;
          ? if(layer>0){
          ???? --layer;
          ???? if( dom.hasChildNodes && dom.hasChildNodes() ){
          ?????? for(var i=0;i<dom.childNodes.length;i++ ){
          ????? array.push(dom.childNodes.item(i));
          ????????? recursiveNodes(array, dom.childNodes.item(i),layer ) ;
          ?????? }
          ???? }else return? ;
          ? }else if(layer<0){
          ???? ++layer;
          ???? if( dom.parentNode ){
          ?????????? array.push( dom.parentNode );
          ?????????? recursiveNodes( array,dom.parentNode,layer)
          ???? }else return ;
          ? }
          }

          /*
          [@name || && > < >= <= != @location='UK']
          */
          function singleStep(dom,stepAction,stepStr){
          ? var allArrData = [] ;
          ? var arrData = [] ;
          ? var num = stepAction.split(/\//).length ;
          ? recursiveNodes(allArrData,dom,num==2?1:999);
          ?
          ? stepStr = trim(stepStr) ;
          ? var nodeName? ;
          ? var nodeNum ;
          ? var conds = true ;
          ???? //判斷單匹配 是否有 屬性對(duì)比? [@..=..]
          ? if( /\[(.*?)\]/.test(stepStr) ){
          ????? nodeName = trim( /.*?(?=\[{1})/g.exec(stepStr)[0]?? ).replace(/\*/g,".*") ;
          ????? conds = /\[(.*?)\]/.exec(stepStr)[1].replace(/\*/g,".*") ;
          ????? if(! isNaN(conds) ){
          ??? nodeNum = parseInt(conds)-1;

          ????? }else{
          ????? //屬性 替換為
          ??????? conds = conds.replace(/(@)(.*?)(?=\W)/g," allArrData[i].getAttribute('$2') ") ;
          ??????? conds = conds.replace( /([\W]+)(.*?)::\'(.*?)\'/g," $1 /$3/g.test($2) " ) ;
          ??????? conds = conds.replace( /(text\(\))/g ," allArrData[i].innerHTML ") ;
          ??????? conds = conds.replace( /([\w\s])(=)/g ,"$2=") ;

          ????? }
          ? }else{
          ????? nodeName = stepStr ;
          ? }

          ? for(var j=i=0;i<allArrData.length;i++){
          ???? if(? eval('/'+nodeName+'/i.test( allArrData[i].nodeName ) ')?? ){
          ??? if(typeof nodeNum=="number"){
          ??? ? if(j==nodeNum){ arrData.push( allArrData[i] );? return arrData; }
          ??? ? else ??? ++j;
          ??? }else if( eval(' allArrData[i].getAttribute && '+conds) ){
          ????????? arrData.push( allArrData[i] );
          ??????? }
          ???? }
          ? }
          ? return arrData ;
          }


          function getXpath(dom,xpathStr){
          ?? var xpaths = xpathStr.split(/(\/{1,2})/g);
          ??? var arrDom = [dom] ;
          ?? for(var i=1;i<xpaths.length;i=i+2){
          ??????? var arrData = [];
          ??????? for(var j=0;j<arrDom.length;j++)
          ????????? arrData = arrData.concat( singleStep(arrDom[j],xpaths[i],xpaths[i+1]) );
          ??????? arrDom = arrData ;
          ?? }
          ?? return arrDom ;
          }

















          ******************************************************************************************************
          function trim(str){ return str.replace(/(^\s*)|(\s*$)/g,""); }

          function recursiveNodes(array,dom,layer){
          ? if( layer==0 ) return ;
          ? if(layer>0){
          ???? --layer;
          ???? if( dom.hasChildNodes && dom.hasChildNodes() ){
          ?????? for(var i=0;i<dom.childNodes.length;i++ ){
          ????? array.push(dom.childNodes.item(i));
          ????????? recursiveNodes(array, dom.childNodes.item(i),layer ) ;
          ?????? }
          ???? }else return? ;
          ? }else if(layer<0){
          ???? ++layer;
          ???? if( dom.parentNode ){
          ?????????? array.push( dom.parentNode );
          ?????????? recursiveNodes( array,dom.parentNode,layer)
          ???? }else return ;
          ? }

          }



          /*
          ? [@name || && > < >= <= != @location='UK']
          */
          function singleStep(dom,stepAction,stepStr){
          ? var allArrData = [] ;
          ? var arrData = [] ;
          ? var num = stepAction.split(/\//).length ;
          ? recursiveNodes(allArrData,dom,num==2?1:999);
          ?
          ? stepStr = trim(stepStr) ;
          ? var nodeName? ;
          ? var conds = true ;
          ???? //判斷單匹配 是否有 屬性對(duì)比? [@..=..]
          ? if( /\[(.*?)\]/.test(stepStr) ){
          ????? nodeName = trim( /^(.*?)\[{1}/.exec(stepStr)[1] ) ;
          ?????????????? //屬性 替換為
          ????? conds = /\[(.*?)\]/.exec(stepStr)[1].replace(/(@)(.*?)(?=\W)/g," allArrData[i].getAttribute('$2').toString() ") ;
          ????? conds = conds.replace( /([\W]+)(.*?)::\'(.*?)\'/g," $1 /$3/g.test($2) " ) ;
          ??????? conds = conds.replace( /(text\(\))/g ," allArrData[i].innerHTML ") ;
          ????? conds = conds.replace( /([\w\s])(=)/g ,"$2=") ;
          ? }else{
          ????? nodeName = stepStr ;
          ???? }

          ? for(var i=0;i<allArrData.length;i++){
          ???? if(? new RegExp(nodeName, 'i').test( allArrData[i].nodeName ) && eval(conds) ){
          ???????? arrData.push( allArrData[i] );
          ???????????? }
          ? }
          ? return arrData ;
          }


          function getXpath(dom,xpathStr){
          ?? var xpaths = xpathStr.split(/(\/{1,2})/g);
          ??? var arrDom = [dom] ;
          ?? for(var i=1;i<xpaths.length;i=i+2){
          ??????? var arrData = [];
          ??????? for(var j=0;j<arrDom.length;j++)
          ????????? arrData = arrData.concat( singleStep(arrDom[j],xpaths[i],xpaths[i+1]) );
          ??????? arrDom = arrData ;
          ?? }
          ?? return arrDom ;
          }

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 襄汾县| 澄迈县| 大邑县| 荔浦县| 新宁县| 沙坪坝区| 房山区| 深泽县| 双城市| 玉田县| 区。| 万载县| 鸡东县| 康定县| 九江市| 湟源县| 古田县| 思茅市| 龙南县| 甘洛县| 东辽县| 临颍县| 青海省| 鄂托克旗| 海阳市| 剑阁县| 桑日县| 临猗县| 常熟市| 信丰县| 竹溪县| 丰顺县| 德昌县| 册亨县| 宝兴县| 阳西县| 宁津县| 吕梁市| 江城| 恩平市| 建瓯市|