2010-05-25 57 views
1

這只是一個簡單的問題。我目前正在使用Mozilla的Rhino開發一個小的web應用程序。作爲一個步驟,我需要獲取網頁並過濾所有節點。爲此,我使用E4X。我以爲我可以這樣做:在E4X中過濾

var pnodes = doc..*(p); 

但是,這會產生一個錯誤。它是如何做對的?

(BTW:這僅僅是提高性能的步驟中的代碼已經做得很好,只是有點慢。)

+0

你只是想在頁面上獲得**所有**節點,包括嵌套的節點嗎? – Anurag 2010-05-25 17:34:28

+0

是的,我想讓每個有p節點的節點都是它的子節點。 – fb55 2010-05-25 18:10:57

回答

2

您應該能夠使用以下命令:

doc..*.(name() == "p") 

注在Rhino和SpiderMonkey實現中有一個bug,其中過濾器表達式name() == "p"與當前節點的範圍不正確,因此沒有定義XMLXMLList方法。


另一個可行的方法是查找所有p節點文檔中和累積每個的父在陣列中。

var elements = []; 

for each (var p in doc..p) { 
    var parent = p.parent(); 
    if(elements.indexOf(parent) === -1) 
     elements.push(parent); 
} 
+0

是的,效率是我的問題。我目前的解決方案是在處理p節點之前檢查每個節點,這需要一些時間,對於正常頁面大約0.5s。我想只是有效地收集節點可能會大大減少這個時間。 我看到人們用我以前試過的方式過濾節點,我只是無法弄清楚如何做到這一點。 – fb55 2010-05-25 19:18:44

+0

上述版本本地過濾所有「p」節點,並將每個節點的父節點收集到一個數組中,而不是檢查每個節點是否爲「p」。您可以使用父節點作爲對象中的鍵來查找'O(1)'而不是使用'indexOf'來檢查節點是否已經存在於Array中。 – Anurag 2010-05-25 19:51:46