關於xml的DOM物件 |
答題得分者是:sryang
|
sincoew
一般會員 ![]() ![]() 發表:7 回覆:10 積分:3 註冊:2008-02-22 發送簡訊給我 |
各位前輩大大你好:
請問一下, 如果我要GetAttribute("x"),那前提是我要抓到每一個node, 可是如果我不知道每個node的childnode有幾層,那我要怎麼抓到全部的node? xml有辦法取得平行的ChildNodes->Count,好像沒辦法取得垂直的Count? 如下:(我要抓到每個Attribute("x")) [code xml] [/code] 補充問題 因為我的目地是對XML文件裡面的特定Attribute做修改動作, 我認為用DOM可以做到比較精準的修改, 但是還有另一種方法是,直接用開檔的方式比較特定字串, 有人可以給我建議DOM寫法的優劣分析嗎? 謝謝(因為不想再寫所謂的"堪用"但是又毫無效率的程式)QQ 感謝QQ~!!!!! 如果有敘述不清的地方請見諒 |
sryang
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
我用的是 Delphi
FDOM.documentElement.selectNodes('*/@x'); 這樣可以抓到所有第一層有 x 這個 Attribute 的 Nodes FDOM 的型態是 IXMLDOMDocument 傳回值的型態是 IXMLDOMNodeList 抓第二層就是 FDOM.documentElement.selectNodes('*/*/@x'); 以此類推 至於要抓到第幾層為止呢? 以第二層為例,就先 FDOM.documentElement.selectNodes('*/*'); 假如有 Nodes,再 FDOM.documentElement.selectNodes('*/*/@x');
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
sincoew
一般會員 ![]() ![]() 發表:7 回覆:10 積分:3 註冊:2008-02-22 發送簡訊給我 |
===================引 用 sryang 文 章=================== 我用的是 Delphi FDOM.documentElement.selectNodes('*/@x'); 這樣可以抓到所有第一層有 x 這個 Attribute 的 Nodes FDOM 的型態是 IXMLDOMDocument 傳回值的型態是 IXMLDOMNodeList 抓第二層就是 FDOM.documentElement.selectNodes('*/*/@x'); 以此類推 至於要抓到第幾層為止呢? 以第二層為例,就先 FDOM.documentElement.selectNodes('*/*'); 假如有 Nodes,再 FDOM.documentElement.selectNodes('*/*/@x'); =========================================================== 謝謝前輩喔 但是這種寫法是否就是要遞迴才做得到?? 因為我必須動態去取得任何不同文件的相同Attribute 所以程式必須要動態的,(DOM好像沒有next 下一層??) 假設這個樹狀展開以後,會很複雜,那是否直接讀檔比對字串會更好呢?? 謝謝前輩!! |
sryang
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
不需要遞迴,兩個迴圈就可以做完了
這樣的方法就像剝洋蔥一樣,一層一層的剝 並不是針對某節點的下一層去搜尋,而是從整個 XML 文件的「根節點」去搜尋 以 '*/*/@x' 這樣的搜尋字串為例,找到的節點,是「所有的第二層」節點中,包含有 x 這個 Attribute 的節點 我照樣用 Delphi 舉例 [code delphi] procedure TForm1.Button1Click(Sender: TObject); var i: integer; queryString: string; nodeList: IXMLDOMNodeList; begin queryString := '*'; while true do begin // 先看某層有沒有節點 nodeList := FDOM.documentElement.SelectNodes(queryString); // 某層沒有節點了,就離開迴圈 if (nodeList = nil) or (nodeList.length = 0) then break; // 取得某層包含 x Attribute 的節點 nodeList := FDOM.documentElement.SelectNodes(queryString '/@x'); // 若某層有包含 x Attribute 的節點,就處理這些節點 if (nodeList <> nil) and (nodeList.length > 0) then begin for i := 0 to nodeList.length - 1 do begin // 這裡舉的例子,僅是把節點的名稱與值加入一個 Listbox ListBox1.Items.Add(nodeList[i].nodeName '=' nodeList[i].nodeValue); end; end; // 將 queryString 加入 '/*' 以便繼續尋找下一層 queryString := queryString '/*'; end; end; [/code]
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
編輯記錄
sryang 重新編輯於 2008-07-07 09:50:58, 註解 無‧
|
sincoew
一般會員 ![]() ![]() 發表:7 回覆:10 積分:3 註冊:2008-02-22 發送簡訊給我 |
|
cindyliu
一般會員 ![]() ![]() 發表:16 回覆:18 積分:6 註冊:2008-09-17 發送簡訊給我 |
|
maverickchen
一般會員 ![]() ![]() 發表:0 回覆:1 積分:0 註冊:2005-12-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |