針對HTMLElement的CSS選擇器最短路徑反查算法
【技術領域】
[0001]本發(fā)明屬于網(wǎng)絡前端開發(fā)領域,尤其是涉及一種針對HTMLElement的CSS選擇器最短路徑反查算法。
【背景技術】
[0002]XPath即為XML路徑語言,它是一種用來確定XML (標準通用標記語言的子集)文檔中某部分位置的語言。XPath基于XML的樹狀結構,提供在數(shù)據(jù)結構樹中找尋節(jié)點的能力。在現(xiàn)有技術XPath表達節(jié)點路徑中,使用者不得不接受一套日常并不常用的語法規(guī)范。該技術是針對XML的,用于對HTML文檔的節(jié)點查詢的實踐中,表達結果過于冗長。在HTML中使用XPath語法對節(jié)點路徑進行反查,在當下和也是一項效率低下的任務。當代瀏覽器中JavaScript解釋器已經(jīng)能內(nèi)置CSS查詢器,所以用CSSPath來代替XPath既能提高軟件的開發(fā)效率、又能提高軟件的運行效率。
【發(fā)明內(nèi)容】
[0003]有鑒于此,本發(fā)明旨在提出一種針對HTMLElement的CSS選擇器最短路徑反查算法,以提高節(jié)點的查詢效率。
[0004]為達到上述目的,本發(fā)明的技術方案是這樣實現(xiàn)的:
[0005]針對HTMLElement的CSS選擇器最短路徑反查算法,設定節(jié)點D為當前節(jié)點,算法包括
[0006]S1.根據(jù)當前節(jié)點的屬性值id或者class,確定當前節(jié)點的路徑,若該節(jié)點的路徑唯一指向當前節(jié)點,則結束算法,若不唯一指向當前節(jié)點,則設定節(jié)點D的路徑為路徑S,進入步驟S2 ;
[0007]S2.循環(huán)將當前節(jié)點的父節(jié)點路徑疊加在路徑S上,得到新的節(jié)點D的路徑,若該D節(jié)點路徑唯一指向節(jié)點D,則結束算法,若不唯一指向節(jié)點D,則進入步驟S3 ;
[0008]S3.在可以指向節(jié)點D的所有路徑中選擇出其中最短的一個路徑SP,并查找出該路徑SP指向的所有節(jié)點的集合A,在所述集合A中找到節(jié)點D的位置,作為節(jié)點D的索引I,路徑SP加索引I作為節(jié)點D的路徑。
[0009]進一步的,所述步驟SI包括
[0010]Sll.判斷當前節(jié)點是否有專屬于它的id,若有,貝Ij當前節(jié)點路徑為id,算法結束,若無,則進入步驟S12。
[0011]S12.判斷當前節(jié)點的當前節(jié)點路徑加class能否唯一指向當前節(jié)點,若能,則當前節(jié)點路徑為id加class,算法結束,若不能,則進入步驟S2。
[0012]進一步的,所述步驟Sll包括
[0013]S111.判斷當前節(jié)點是否有id,若有,則當前節(jié)點路徑為id,進入步驟SI 12,若無,則進入步驟S12 ;
[0014]S112.判斷當前節(jié)點路徑是否唯一指向當前節(jié)點,若是,則算法結束,若否,則進入步驟S12。
[0015]進一步的,所述步驟S12包括
[0016]S121.判斷當前節(jié)點是否有class,若有,則當前節(jié)點路徑加上class成為新的節(jié)點路徑,進入步驟S122,若無,則設定節(jié)點D的路徑為路徑S,進入步驟S2 ;
[0017]S122.判斷當前節(jié)點路徑是否唯一指向當前節(jié)點,若是,則算法結束,若否,則設定節(jié)點D的路徑為路徑S,進入步驟S2。
[0018]進一步的,所述步驟S2包括
[0019]S21.將當前節(jié)點的父節(jié)點設為新的當前節(jié)點,查找當前節(jié)點的路徑,設定新的路徑S為當前節(jié)點路徑加路徑S,進入步驟S22 ;
[0020]S22.判斷路徑S是否唯一指向節(jié)點D,若是,則結束算法,若否,則進入步驟S23 ;
[0021]S23.判斷當前節(jié)點是否為根節(jié)點,若是,則進入步驟S3 ;若否,則進入步驟S21。
[0022]進一步的,所述步驟S21包括
[0023]S211.將當前節(jié)點的父節(jié)點設為新的當前節(jié)點,判斷當前節(jié)點是否有id,若有,則當前節(jié)點路徑為id,進入步驟S212,若無,則進入步驟S213 ;
[0024]S212.判斷當前節(jié)點路徑是否唯一指向當前節(jié)點,若是,貝Ij進入步驟S214,若否,則進入步驟S213 ;
[0025]S213.判斷當前節(jié)點是否有class,若有,則當前節(jié)點路徑加上class成為新的節(jié)點路徑,進入步驟S214,若無,進入步驟S214 ;
[0026]S214.設定新的路徑S為當前節(jié)點路徑加路徑S,進入步驟S22。
[0027]進一步的,判斷節(jié)點路徑是否唯一指向節(jié)點的方法為查找出節(jié)點路徑指向的所有的節(jié)點集合,若該集合的長度為1,則可認定節(jié)點路徑唯一指向該節(jié)點。
[0028]相對于現(xiàn)有技術,本發(fā)明所述的針對HTMLElement的CSS選擇器最短路徑反查算法具有以下優(yōu)勢:
[0029]本發(fā)明所述的針對HTMLElement的CSS選擇器最短路徑反查算法解決了獲得該節(jié)點優(yōu)化和擴展的最短CSS查詢路徑(CSSPath)的問題,既能提高軟件的開發(fā)效率、又能提高軟件的運行效率。
【附圖說明】
[0030]構成本發(fā)明的一部分的附圖用來提供對本發(fā)明的進一步理解,本發(fā)明的示意性實施例及其說明用于解釋本發(fā)明,并不構成對本發(fā)明的不當限定。在附圖中:
[0031]圖1為本發(fā)明實施例所述的步驟SI的流程圖;
[0032]圖2為本發(fā)明實施例所述的步驟S2的流程圖。
【具體實施方式】
[0033]需要說明的是,在不沖突的情況下,本發(fā)明中的實施例及實施例中的特征可以相互組合。
[0034]在編輯測試代碼時,需要通過捕捉某一確定元素的css路徑從而選中該元素,并要求該元素是唯一的。查找節(jié)點css路徑的方法為
[0035]如圖1所示,S111.判斷當前節(jié)點是否有id,若有,則當前節(jié)點路徑為id,進入步驟SI 12,若無,則進入步驟S12 ;這一步先行檢測節(jié)點是否具有id
[0036]S112.判斷當前節(jié)點路徑是否唯一指向當前節(jié)點,若是,則算法結束,若否,則進入步驟S12。若具有只屬于節(jié)點的id,則找到最短路徑,算法可以結束,若沒有id或者id不唯一指向該節(jié)點,就需要進入下一個步驟,檢查節(jié)點的id。
[0037]S121.判斷當前節(jié)點是否有class,若有,則當前節(jié)點路徑加上class成為新的節(jié)點路徑,進入步驟S122,若無,則設定節(jié)點D的路徑為路徑S,進入步驟S2 ;對節(jié)點的class屬性就行判斷,作為進一步限定路徑的屬性值。
[0038]S122.判斷當前節(jié)點路徑是否唯一指向當前節(jié)點,若是,則算法結束,若否,則設定節(jié)點D的路徑為路徑