解析Html生成標籤樹(一)

2021-08-22 16:54:12 字數 1699 閱讀 8186

解析html成標籤樹結構以後,我們不但可以很容易取得想要的元素,同時也很容易將html轉換成對應的xml檔案。但是由於**是在公司寫的,所以沒有貼上出來的可能性,所以我只能給出大概的**流程,具體細節描述,相信各位都很容易寫出來,並且寫的比我好,關鍵的是演算法實現思想。演算法的關鍵如下:

1.html中每個tag都是都將作為樹中的乙個節點存在的,每個tag都屬於樹中的某一層。

2.輔助資料結構:棧(stack)、list、hashtable。其中hashtable[i](i屬於int型別)是乙個list,用於臨時儲存第i層子tag。

3.順序掃瞄html文字,當遇到」4.遇到這樣的標誌,表示可能是某個tag的結束。解析出此結束標誌的tag名。如果在棧中找到與此結束標誌名同名的元素(此元素屬於棧中第ilevel層),那麼表示找到匹配的tag。則tag出棧,將hashtable[ilevel+1]到hashtable[maxlevel]中的所有元素取出作為此tag的子節點。放入第hashtable [ilevel]中。並記錄tag的結束位置。

5.對於***之間的字串***,將其作為特殊的htmltexttag處理。出棧,和入棧操作與普通tag類似。

6.當棧為空的時候表示最後一次出棧的tag給根節點。

由於是在公司內部開發的東西,所以不可能把源**拿出來貼上,所以只能把大概的**給出。

偽**如下:

public void parse()

tag.beginpos = ibeginpos; //記錄此tag的開始位置

stack.push(tag); //把tag入棧 }}

ch = getcurrentchar();

if (ch == '/')}}

else

//繼續處理下乙個字元

ch = movenext();

}//解析完成以後,如果棧不空,那麼把元素出棧,並把最後一次出棧的元素作為根

if (stack.count > 0)

//最後乙個元素作為根元素

if (tag != null)

}}private void poptag(htmltag tag)

}//表示棧已經為空,那麼最後一次出棧的tag將作為根

if (stack.count == 0)

}private void poptag(string tagname)

htmltag tag = stack.pop(); //元素出棧

int ilevel = stack.count; //記錄棧元素數

while (tag.name != tagname)

//元素出棧後續處理

poptag(tag);

}private htmltag gettag()

htmltag tag = new htmltag();

tag.name = gettagname();

//這裡的attribute我將其作為hashtable型別,hash[屬性名]=屬性值

tag.attribute = gettagattribute();

return tag;

}

解析結束以後,通過訪問m_listroot就可以遍歷出所有的節點了。上面僅僅是給出了大概的方法,不過我相信要將上面的方法轉換成可執行**,各位都是有這個能力的。。。

解析Html生成標籤樹(一)

解析html成標籤樹結構以後,我們不但可以很容易取得想要的元素,同時也很容易將html轉換成對應的xml檔案。但是由於 是在公司寫的,所以沒有貼上出來的可能性,所以我只能給出大概的 流程,具體細節描述,相信各位都很容易寫出來,並且寫的比我好,關鍵的是演算法實現思想。演算法的關鍵如下 1.html中每...

JAVA解析html標籤

最近同事碰到乙個問題,要取出資料庫中靜態頁面標籤中的內容,問我應該怎麼做,我隨口答道,用正規表示式唄,很好正規表示式,其實我也不會用。很久以前我就碰到過類似的問題,當時是我同學問我的,讓我思考一下如何解析html標籤。我當時隨口答道用split唄,結果一頓冷嘲熱諷。在我的逼問下,他告訴我用正則比較好...

HTML標籤簡寫 連寫 快速生成html頁面!

建立多個相同標籤 例 建立無序列表ul裡面4個li標籤 control d是快速複製上一行,也可以實現上面的 給標籤新增屬性 值用 例 div input type email input type password input type submit value 提交 tab 給標籤新增內容用 例...