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

專職C++

不能停止的腳步

  C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
  163 Posts :: 7 Stories :: 135 Comments :: 0 Trackbacks

常用鏈接

留言簿(28)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

這里是基于node的xmldom上擴(kuò)展的工具,在使用appium的時(shí)候,常常需要用source功能來(lái)分析當(dāng)前上下文,所以擴(kuò)展了若干函數(shù),用于分析。

這些代碼是基于node 6.9.x JavaScript ES6語(yǔ)法實(shí)現(xiàn)。(關(guān)于如何在node使用ES6的語(yǔ)法,請(qǐng)參考我的前文:js筆記四:node 6.9.x for gulp完整配置過(guò)程

完成代碼如下:xml_utils.js

  1 import { DOMParser } from "xmldom";
  2 
  3 xml_utils = {};
  4 //------------------------------------------------------------------------------
  5 //解析XML字符串,并返回XML的dom對(duì)象
  6 xml_utils.parseFromString = function ( xmlstring ) {
  7     return new DOMParser().parseFromString( xmlstring );
  8 }
  9 
 10 //判斷是否有該屬性的值
 11 xml_utils.hasNodeAttrib = function ( node, attrib, attrib_value, flag_index ) {
 12     var nCnt = ( node && node.attributes ) ? node.attributes.length : 0;
 13     for ( var i = 0; i < nCnt; i++ ) {
 14         var attr = node.attributes[i];
 15         //if (attr.name == attrib) {
 16         //    console.log("found attrib:" + attrib + "=" + attr.value + ", dest=" + attrib_value);
 17         //}
 18         if ( attr.name != attrib ) continue;
 19         if ( flag_index === true ) {
 20             if ( attr.value.indexOf( attrib_value ) >= 0 ) return true;
 21         }
 22         else {
 23             if ( attr.value.trim() == attrib_value ) return true;
 24         }
 25     }
 26     return false;
 27 }
 28 
 29 //取指定的屬性
 30 xml_utils.getNodeAttrib = function ( node, attrib ) {
 31     var nCnt = ( node && node.attributes ) ? node.attributes.length : 0;
 32     for ( var i = 0; i < nCnt; i++ ) {
 33         var attr = node.attributes[i];
 34         if ( attr.name == attrib ) return attr;
 35     }
 36     return null;
 37 }
 38 
 39 //前一個(gè)節(jié)點(diǎn)
 40 xml_utils.getNodePre = function ( node ) {
 41     if ( node == null || node.parentNode == null ) return null;
 42     var pNode = node.parentNode;
 43     var nCnt = pNode.childNodes ? pNode.childNodes.length : 0;
 44     var nIndex = -1;
 45     for ( var i = 0; i < nCnt; i++ ) {
 46         if ( pNode.childNodes.item( i ) === node ) {
 47             nIndex = i;
 48             break;
 49         }
 50     }
 51     if ( nIndex > 0 ) {
 52         var nNextIndex = nIndex - 1;
 53         if ( nNextIndex < nCnt ) return pNode.childNodes.item( nNextIndex );
 54     }
 55     return null;
 56 }
 57 
 58 
 59 //下一個(gè)節(jié)點(diǎn)
 60 xml_utils.getNodeNext = function ( node ) {
 61     if ( node == null || node.parentNode == null ) return null;
 62     var pNode = node.parentNode;
 63     var nCnt = pNode.childNodes ? pNode.childNodes.length : 0;
 64     var nIndex = -1;
 65     for ( var i = 0; i < nCnt; i++ ) {
 66         if ( pNode.childNodes.item( i ) === node ) {
 67             nIndex = i;
 68             break;
 69         }
 70     }
 71     if ( nIndex >= 0 ) {
 72         var nNextIndex = nIndex + 1;
 73         if ( nNextIndex < nCnt ) return pNode.childNodes.item( nNextIndex );
 74     }
 75     return null;
 76 }
 77 
 78 //查找指定屬性的節(jié)點(diǎn)
 79 xml_utils.findNodeByAttribName = function ( node, attrib, attrib_value, flag_index ) {
 80     if ( this.hasNodeAttrib( node, attrib, attrib_value, flag_index ) ) return node;
 81     //便利所有的子節(jié)點(diǎn)  使用深度遍歷的方式
 82     var nChildCnt = node.childNodes ? node.childNodes.length : 0;
 83     for ( var i = 0; i < nChildCnt; i++ ) {
 84         var n = node.childNodes.item( i );
 85         var nRet = this.findNodeByAttribName( n, attrib, attrib_value, flag_index );
 86         if ( nRet ) {
 87             return nRet;
 88         }
 89     }
 90     return null;
 91 }
 92 
 93 //將節(jié)點(diǎn)數(shù)組中指定的屬性值,放到集合中
 94 xml_utils.nodesAttribToSet = function (nodeArray, attribName) {
 95     let retSet = new Set();
 96     for(let n of nodeArray)    
 97     {
 98         if(n.attrMap)
 99         {
100             let v = n.attrMap.get(attribName);
101             if(v) retSet.add(v);
102         }
103         else
104         {
105             let nCnt = n.attributes ? n.attributes.length : 0;
106             for(let i = 0;i < nCnt;i++) {
107                 let attr = n.attributes.item(i);
108                 if(attr && attr.name.trim() == attribName)
109                 {
110                     retSet.add(attr.value.trim());
111                     break;
112                 }
113             }
114         }
115     }
116     return retSet;
117 }
118 
119 //通過(guò)指定的函數(shù),來(lái)確定要設(shè)的值
120 xml_utils.nodesAttribToSetEx = function (nodeArray, getFunction) {
121     if(typeof getFunction === "function") {
122         let retSet = new Set();
123         for(let n of nodeArray)    
124         {
125             let [r,txt] = getFunction(n);
126             if(r) retSet.add(txt.trim());
127         }
128         return retSet;    
129     }
130     else if(Array.isArray(getFunction)) {  //如果傳入的是一個(gè)數(shù)組
131         return xml_utils.nodesAttribToSetEx(nodeArray, new Set(getFunction));
132     }
133     else if(getFunction instanceof Set) {
134         let s = getFunction;
135         let retSet = new Set();
136         for (let n of nodeArray) {
137             let nCnt = n.attributes ? n.attributes.length : 0;
138             for (let i = 0; i < nCnt; i++) {
139                 let attr = n.attributes.item(i);
140                 if (attr && s.has(attr.name.trim())) {
141                     if (!attr.value) continue;  //如果屬性值不存在
142                     let v = attr.value.trim();
143                     if (v.length == 0) continue//如果為空串
144                     retSet.add(v);
145                 }
146             }
147         }  
148         return retSet;     
149     }
150     else return new Set();
151     //if(!(typeof getFunction ==="function")) return retSet;
152 }
153 
154 //判斷是否有指定含有屬性的節(jié)點(diǎn) 這里會(huì)要求指定節(jié)點(diǎn)名稱,也就是class 其它需要的屬性,則要另外判斷
155 //node表示是當(dāng)前的節(jié)點(diǎn)  
156 //要查找的節(jié)點(diǎn)名稱和屬性列表 [{class:"xxx",y:"134"},{class:"yyyy"}]
157 //返回符合條件的節(jié)點(diǎn)數(shù)組
158 //這里的方法,類似于 getNodesByAttrib 但是這個(gè)方法在性能上做了優(yōu)化,參數(shù)更加直觀
159 xml_utils.getNodesByClass = function(node, classNameList) {
160     let r = [];
161     if(!node) r;
162 
163     let cmap = new Map();           //class和class條件列表
164 
165     if(Array.isArray(classNameList)) {
166         for(let e of classNameList) {  //將每個(gè)條件取出來(lái)
167             let classValue = e.class;  
168             if(classValue) 
169             {
170                 let nCnt = 0;
171                 for(let i in e) nCnt ++;  //計(jì)算需要比較屬性的數(shù)量,并保存,用于后面比較
172                 cmap.set(classValue, {c:e, count:nCnt}); 
173             }
174         }
175     }
176 
177     function check(n) {
178         if(!n) return false;  //如果節(jié)點(diǎn)為null,則返回false
179 
180         let attrCnt = xml_utils.getAttributeCount(n);
181         if(attrCnt == 0) return false;  //沒(méi)有沒(méi)有任何屬性
182 
183         let e = cmap.get(n.nodeName);     //取條件列表,如果沒(méi)有它的條件列表,則返回false
184         if(!e) return false;  
185         let c = e.c;  //條件列表
186 
187         //構(gòu)建屬性映射表
188         let foundCount = 0;
189         for(let i = 0; i < attrCnt; i++) {
190             let attr = n.attributes[i];            
191             let cValue = c[attr.name];
192             if(cValue === undefined) continue;      //如果這個(gè)不是條件之一,則下一個(gè)
193             if(cValue === null || cValue === attr.value) foundCount++;
194             else return false;      //如果找到屬性存在,但是屬性值不相同,則表示不合條件
195         }
196         //計(jì)算條件的數(shù)量
197         return e.count == foundCount;
198     }
199     //編歷所有節(jié)點(diǎn)
200     function findNode(n, r) {
201         if(check(n)) r.push(n);
202         let childCnt = xml_utils.getChildNodeCount(n);
203         for(let i = 0; i < childCnt; i++) {
204             findNode(n.childNodes.item(i),r);
205         }
206     }
207     findNode(node, r);
208     return r;
209 }
210 
211 //判斷是否有指定含有屬性的節(jié)點(diǎn)
212 //node表示是當(dāng)前的節(jié)點(diǎn)
213 //attrib是一個(gè)二維數(shù)組鍵值對(duì)  如[["attrib1","value1"],["attrib2","value2"],["attrib3"]]
214 //返回符合條件的節(jié)點(diǎn)數(shù)組
215 xml_utils.getNodesByAttrib = function (node, attrib) {
216     let r = [];
217     if(!node) r;
218     //構(gòu)造條件
219     let c = {};
220     c.map = new Map();
221     c.set = new Set();
222     if(Array.isArray(attrib)) {
223         for(let e of attrib) {
224             if(!Array.isArray(e)) continue;
225             if(e.length == 1) c.set.add(e[0]);
226             else if(e.length == 2) {
227                 let mm = c.map.get(e[0]);
228                 if(!mm) {
229                     mm = new Set();
230                     c.map.set(e[0],mm);
231                 }
232                 mm.add(e[1]);
233             }
234         }
235     }
236     //檢查有沒(méi)有符合屬性的節(jié)點(diǎn)
237     function check(n) {
238         let attrCnt = xml_utils.getAttributeCount(n);
239         //編歷所有屬性,判斷是不是符合要求
240         for(let i = 0; i < attrCnt; i++) {
241             let attr = n.attributes[i];
242             if(c.set.has(attr.name)) return true;
243             let o = c.map.get(attr.name);
244             if(o && o.has(attr.value.trim())) return true;
245         }
246         return false;
247     }
248     //編歷所有節(jié)點(diǎn)
249     function findNode(n, r) {
250         if(check(n)) r.push(n);
251         let childCnt = xml_utils.getChildNodeCount(n);
252         for(let i = 0; i < childCnt; i++) {
253             findNode(n.childNodes.item(i),r);
254         }
255     }
256     findNode(node, r);
257     return r;
258 }
259 
260 //判斷指定的節(jié)點(diǎn)中,是含有指定的屬性列表
261 //attrib是一個(gè)二維數(shù)組鍵值對(duì)  如[["attrib1","value1"],["attrib2","value2"],["attrib3"]]
262 xml_utils.hasAttribInNode = function (node, attrib) {
263     if(!Array.isArray(attrib)) return false;
264     let nAttribCount = (node && node.attributes) ? node.attributes.length : 0;
265     if(nAttribCount <= 0) return false;
266     let mapAttr = new Map();
267     for(let i = 0;i < nAttribCount;i++) {
268         let e = node.attributes[i];
269         mapAttr.set(e.name.trim(), e.value.trim());
270     }
271     let bRet = true;
272     for(let i = 0;i < attrib.length;i++) {
273         let attr = attrib[i];
274         if(!Array.isArray(attr)) continue;  //如果不是數(shù)組,則忽略
275         if(attr.length <= 0) continue;        //如果數(shù)組為空,則忽略
276         if(attr.length == 1) //如果只有一個(gè)屬性,則判斷該屬性是否存在
277         {
278             if(!mapAttr.has(attr[0])) return false;
279         }
280         else {
281             if(!(mapAttr.get(attr[0]) === attr[1])) return false;
282         }
283     }
284     node.attrMap = mapAttr;
285     return bRet;
286 }
287 //將一個(gè)xml節(jié)點(diǎn)含屬性轉(zhuǎn)為字符  不含比子節(jié)點(diǎn)
288 xml_utils.nodeAttribToString = function (node) {
289     let strRet = "<" + (node.tagName || "") + " ";
290     let nAttribCount = (node && node.attributes) ? node.attributes.length : 0;
291     for(let i = 0;i < nAttribCount;i++) {
292         let e = node.attributes[i];
293         strRet = strRet + ' ' + e.name + '="' + e.value + '"';
294     }
295     strRet += " />"
296     return strRet;
297 }
298 
299 
300 //取找tagName的第一個(gè)節(jié)點(diǎn)  
301 /**
302  * 默認(rèn)是深度遍歷
303  * @param node 開始查找的節(jié)點(diǎn)
304  * @param targetTagName 節(jié)點(diǎn)的名稱
305  * @param flagBreadth 廣度遍歷的標(biāo)志 @default = false
306  */
307 xml_utils.findNodeByTagName = function (node, targetTagName, flagBreadth = false) {
308     if(!node) return null;
309     if(node.tagName === targetTagName) {
310         console.log("找到節(jié)點(diǎn)1:",  xml_utils.nodeAttribToString(node));
311         return node;
312     }
313     let childCnt = node.childNodes?node.childNodes.length:0;
314     if(flagBreadth){
315         for(let i = 0; i < childCnt; i++)
316         {
317             let childNode = node.childNodes.item(i);
318             if(childNode.tagName === targetTagName) {
319                 console.log("找到節(jié)點(diǎn)2:",  xml_utils.nodeAttribToString(childNode));
320                 return childNode;
321             }
322         }
323         for(let i = 0; i < childCnt; i++)
324         {
325             let n = this.findNodeByTagName(node.childNodes.item(i), targetTagName, flagBreadth);
326             if(n != nullreturn n;
327         }
328     }
329     else {
330         for(let i = 0; i < childCnt; i++)
331         {
332             let n = this.findNodeByTagName(node.childNodes.item(i), targetTagName, flagBreadth);
333             if(n != nullreturn n;
334         }
335     }
336     return null;
337 }
338 
339 //取節(jié)點(diǎn)的子節(jié)點(diǎn)的個(gè)數(shù)
340 xml_utils.getChildNodeCount = function(node) {
341     if(!node) return 0;
342     if(!node.childNodes) return 0;
343     return node.childNodes.length;
344 }
345 //取節(jié)點(diǎn)的屬性個(gè)數(shù)
346 xml_utils.getAttributeCount = function(node) {
347     if(!node) return 0;
348     if(!node.attributes) return 0;
349     return node.attributes.length;
350 }
351 //取指定下標(biāo)的子節(jié)點(diǎn)
352 xml_utils.getChildNodeByIndex = function (node, index) {
353     if(!node) return null;
354     if(!node.childNodes) return null;
355     return node.childNodes.item(index);
356 }
357 //取指定下標(biāo)的屬性
358 xml_utils.getAttributeByIndex = function(node, index) {
359     if(node) return null;
360     if(!node.attributes) return null;
361     return node.attributes[index];
362 }
363 //打印指定node XML
364 //這個(gè)是用于測(cè)試
365 xml_utils.dumpXmlNode = function (pre, node) {
366     pre = pre || "";
367     let tagName = (node && node.tagName)?node.tagName:"";
368     let nChildCnt = xml_utils.getChildNodeCount(node);
369     let nAttrCnt = xml_utils.getAttributeCount(node);
370     let s = `${pre}<${tagName}`;
371     for(let i = 0; i < nAttrCnt; i++) {
372         let attr = node.attributes[i];
373         s = s + ` ${attr.name}="${attr.value}"`;
374     }
375     if(nChildCnt > 0) {
376         s = s + ">";
377         console.log(s);
378         for(let i = 0; i < nChildCnt; i++)
379         {
380             xml_utils.dumpXmlNode(pre + "  ", node.childNodes.item(i));
381         }
382         console.log(`${pre}</${tagName}>`);
383     } else {
384         s = s + "/>";
385         console.log(s);
386     }
387 }
388 export { xml_utils};
389 export default xml_utils;
posted on 2017-02-20 14:31 冬瓜 閱讀(1333) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 原創(chuàng) 、appiumjavascript
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区三区日韩在线观看| 女同性一区二区三区人了人一| 亚洲精品影院| 久久九九久精品国产免费直播| 国产精品欧美一区二区三区奶水| 久久精品亚洲精品国产欧美kt∨| 亚洲国产精品小视频| 亚洲网站视频福利| 欧美日韩成人网| 一本色道久久综合狠狠躁的推荐| 欧美激情精品久久久久久黑人| 久久看片网站| 伊人精品成人久久综合软件| 久久婷婷国产综合精品青草| 欧美一区日韩一区| 国产一区二区三区黄| 久久国产成人| 久久精品人人| 亚洲激情在线观看| 亚洲成在线观看| 欧美激情亚洲另类| 亚洲一区二区在| 亚洲一区二区三区免费在线观看| 国产精品免费看久久久香蕉| 欧美一区亚洲| 久久久中精品2020中文| 亚洲国产精品成人综合| 亚洲欧洲在线免费| 国产精品免费aⅴ片在线观看| 欧美一区二区三区在线看| 午夜久久久久久| 合欧美一区二区三区| 欧美大片免费观看| 欧美视频第二页| 久久国产精品毛片| 久久久水蜜桃| 夜夜夜久久久| 欧美一区二区日韩| 亚洲高清在线视频| 一级日韩一区在线观看| 国模精品一区二区三区| 亚洲高清自拍| 国产伦精品一区二区三区在线观看 | 最新国产精品拍自在线播放| 欧美激情亚洲国产| 国产精品xnxxcom| 久久婷婷国产麻豆91天堂| 欧美激情亚洲精品| 久久久水蜜桃av免费网站| 欧美激情亚洲视频| 久久午夜精品| 欧美视频中文一区二区三区在线观看| 久久久不卡网国产精品一区| 欧美激情亚洲国产| 久久精品国产视频| 欧美久久一级| 久久久国产一区二区三区| 欧美精品在线一区二区三区| 久久精品国产综合精品| 欧美国产日本高清在线| 久久精品一区二区三区不卡牛牛| 欧美激情精品久久久久久久变态| 欧美一区二区三区男人的天堂| 欧美午夜激情小视频| 久久一区视频| 欧美一区二区三区免费观看| 欧美黄色大片网站| 毛片一区二区三区| 国产美女高潮久久白浆| 亚洲靠逼com| 亚洲青色在线| 麻豆精品视频在线观看视频| 久久精品免费| 国产美女在线精品免费观看| 亚洲美女黄网| 亚洲国产日韩在线| 久久久久.com| 久久五月天婷婷| 黑人极品videos精品欧美裸| 亚洲一区二区在线观看视频| 亚洲香蕉伊综合在人在线视看| 欧美国产视频在线| 欧美国产日韩精品免费观看| 一区二区三区在线看| 欧美在线日韩精品| 久久疯狂做爰流白浆xx| 国产日韩av高清| 午夜视频一区二区| 欧美一区永久视频免费观看| 国产精品区免费视频| 亚洲一区999| 午夜精品短视频| 国产精品欧美日韩久久| 亚洲女优在线| 久久黄色网页| 激情另类综合| 久久亚洲精品一区二区| 美国十次了思思久久精品导航| 加勒比av一区二区| 欧美成年视频| 日韩一级片网址| 欧美一级黄色录像| 狠狠综合久久av一区二区小说| 久久精品免费观看| 亚洲成人在线视频播放| 精品电影在线观看| 老司机免费视频一区二区| 亚洲国产精品久久久久婷婷老年| 日韩视频三区| 欧美午夜国产| 欧美在线观看日本一区| 欧美.www| 亚洲一区二区精品在线| 国产午夜精品在线| 老色批av在线精品| 99精品国产在热久久婷婷| 欧美在线视频日韩| 91久久久久久国产精品| 国产精品扒开腿做爽爽爽软件 | 欧美日韩亚洲一区二区三区在线 | 国产精品久久久久久亚洲毛片| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲一区自拍| 国产日韩专区| 欧美成人午夜免费视在线看片| 亚洲美女视频| 久久精品一区二区三区中文字幕| 亚洲二区三区四区| 国产精品成人va在线观看| 久久久久久久久久久成人| 91久久精品www人人做人人爽| 亚洲欧美一区二区精品久久久| 激情亚洲成人| 国产精品国产一区二区| 久久久在线视频| 亚洲一区二区三区午夜| 亚洲成人在线免费| 久久国产视频网站| 亚洲精品一级| 久久久久久婷| 亚洲字幕在线观看| 久久精品欧美日韩精品| av不卡免费看| 欧美阿v一级看视频| 亚洲直播在线一区| 亚洲欧洲日产国产综合网| 国产欧美综合在线| 欧美日韩在线三区| 美乳少妇欧美精品| 亚洲综合日韩中文字幕v在线| 亚洲高清久久网| 久久婷婷麻豆| 欧美在线黄色| 亚洲综合日韩在线| 亚洲精品日韩在线观看| 影音先锋国产精品| 国产一区二区三区免费不卡| 欧美三级韩国三级日本三斤| 免费观看欧美在线视频的网站| 午夜精品三级视频福利| 99精品国产在热久久下载| 亚洲高清资源| 欧美激情免费在线| 欧美v亚洲v综合ⅴ国产v| 久久亚洲电影| 久久嫩草精品久久久精品一| 久久不射中文字幕| 午夜亚洲一区| 欧美亚洲视频| 性欧美video另类hd性玩具| 亚洲一区二区三区在线| 亚洲视频电影图片偷拍一区| 亚洲精品在线电影| 日韩视频永久免费观看| 亚洲国产免费看| 亚洲激情小视频| 亚洲三级视频| 一区二区三区国产在线| 在线一区二区三区四区五区| 日韩一区二区高清| 最新国产成人av网站网址麻豆| …久久精品99久久香蕉国产 | 亚洲一区在线观看视频| 一区二区三欧美| 亚洲综合第一| 久久精品成人一区二区三区| 久久久噜噜噜久久| 免费在线亚洲| 国产主播在线一区| 日韩午夜在线播放| 亚洲国产第一| 日韩网站在线| 亚洲欧美日韩精品一区二区| 亚洲欧美日韩另类| 欧美一区国产二区| 另类尿喷潮videofree| 欧美成人午夜激情| 亚洲精品日日夜夜| 午夜视黄欧洲亚洲| 欧美1区2区视频|