2011-11-30 205 views
0

我需要遍歷dom對象,並在其中顯示文本而沒有任何重複。如何遍歷DOM對象?

例如

<div> 
     <div>hello 
     <div>welcome</div> 
     hai 
    </div> 
123 
</div> 

輸出應該是:

hello 
welcome 
hai 
123 

如何實現這個在VBScript?

其實我試着用遞歸,但它不似乎正常工作

function traverse(allnode) 

for each node in allnode 
    if node.hasChildNodes then 
     traverse(node.childNodes) 
    else 
     Msgbox node.nodeValue 
    end if 
end function 

這個功能是打印「文本」超過一次(即每個div元素)。如何在VBScript中實現它?

回答

0

鑑於此HTML:

<html> 
<body> 
    <div> 
    <div> 
    hello 
    <div>welcome</div> 
    hai 
    </div> 
    123 
    </div> 
    <p>noli me tangere</p> 
</body> 
</html> 

在奧多姆和調用此子

Sub traverseDom00(ndX, nInd) 
    WScript.Echo Space(nInd), ndX.nodeName 
    If ndX.hasChildNodes Then 
    Dim ndY 
    For Each ndY In ndX.childNodes 
     traverseDom00 ndY, nInd + 1 
    Next 
    End If 
    WScript.Echo Space(nInd), "/" & ndX.nodeName 
End Sub 

通過traverseDom00 oDOM, 0結果

#document 
    HTML 
    HEAD 
    TITLE 
    /TITLE 
    /HEAD 
    BODY 
    DIV 
    DIV 
     #text 
     /#text 
     DIV 
     #text 
     /#text 
     /DIV 
     #text 
     /#text 
    /DIV 
    #text 
    /#text 
    /DIV 
    P 
    #text 
    /#text 
    /P 
    /BODY 
    /HTML 
/#document 

此子顯示了遞歸DOM遍歷的基本結構。如果你比較這對你的函數(爲什麼功能?),你會看到

  1. 你錯過下一個
  2. 你前檢查具有的childNodes 你循環

基於遍歷代碼結構,很容易拿出

Sub traverseDom01(ndX, aRes) 
    If ndX.hasChildNodes Then 
    Dim ndY 
    For Each ndY In ndX.childNodes 
     traverseDom01 ndY, aRes 
    Next 
    End If 
    If "#text" = ndX.nodeName Then 
    If "DIV" = ndX.parentNode.nodeName Then 
     ReDim Preserve aRes(UBound(aRes) + 1) 
     aRes(UBound(aRes)) = Trim(ndX.nodeValue) 
    End If 
    End If 
End Sub 

收集是一個DIV的孩子的文本。經由

Dim aDTs : aDTs = Array() 
    traverseDom01 oDOM, aDTs 
    WScript.Echo "|" & Join(aDTs, "|") & "|" 

稱爲結果是

|hello|welcome|hai|123|