線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3800
推到 Plurk!
推到 Facebook!

關於xml的DOM物件

答題得分者是:sryang
sincoew
一般會員


發表:7
回覆:10
積分:3
註冊:2008-02-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-05 16:17:02 IP:61.216.xxx.xxx 訂閱
各位前輩大大你好:
請問一下,
如果我要GetAttribute("x"),那前提是我要抓到每一個node,
可是如果我不知道每個node的childnode有幾層,那我要怎麼抓到全部的node?
xml有辦法取得平行的ChildNodes->Count,好像沒辦法取得垂直的Count?
如下:(我要抓到每個Attribute("x"))


[code xml]





[/code]

補充問題
因為我的目地是對XML文件裡面的特定Attribute做修改動作,
我認為用DOM可以做到比較精準的修改,
但是還有另一種方法是,直接用開檔的方式比較特定字串,
有人可以給我建議DOM寫法的優劣分析嗎?
謝謝(因為不想再寫所謂的"堪用"但是又毫無效率的程式)QQ

感謝QQ~!!!!!
如果有敘述不清的地方請見諒


編輯記錄
sincoew 重新編輯於 2008-07-05 17:27:48, 註解 無‧
sincoew 重新編輯於 2008-07-05 17:29:16, 註解 無‧
sincoew 重新編輯於 2008-07-05 17:30:06, 註解 無‧
sincoew 重新編輯於 2008-07-05 17:32:59, 註解 無‧
sincoew 重新編輯於 2008-07-05 17:35:13, 註解 無‧
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-06 16:29:32 IP:124.10.xxx.xxx 訂閱
我用的是 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-07-06 18:23:40 IP:61.216.xxx.xxx 訂閱

===================引 用 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-07-07 09:46:22 IP:59.125.xxx.xxx 訂閱
不需要遞迴,兩個迴圈就可以做完了
這樣的方法就像剝洋蔥一樣,一層一層的剝
並不是針對某節點的下一層去搜尋,而是從整個 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-07-10 00:20:48 IP:118.169.xxx.xxx 訂閱
謝謝喔,抱歉我這麼晚才回,
這麼一說我才注意到...
是用XPath對吧?
這樣看起來應該是可以解決我的問題囉,
我在試試看喔

感謝前輩指點!!!!
感恩喔!!!!!!
希望透過各位前輩的指點能讓程式能力更進步!!
cindyliu
一般會員


發表:16
回覆:18
積分:6
註冊:2008-09-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-02-26 09:26:56 IP:59.120.xxx.xxx 訂閱
請問 var nodeList: IXMLDOMNodeList;

因為程式在這行error,是否要use 什麼東西嗎??

maverickchen
一般會員


發表:0
回覆:1
積分:0
註冊:2005-12-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-05-06 12:27:24 IP:123.50.xxx.xxx 訂閱
uses msxml;

===================引 用 cindyliu 文 章===================
請問 var nodeList: IXMLDOMNodeList;

因為程式在這行error,是否要use 什麼東西嗎??

系統時間:2024-11-25 20:30:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!