2009-12-15 75 views
3

我寫了一個VBScript,它應該橫切XML文件中的所有節點,而不考慮樹的深度。這很好,以外,不顯示2級或更多級別的那些節點的節點名稱。我需要節點名稱以及值,以便我有名稱/值對供其他程序進一步處理。任何人都可以幫助我獲取缺少的節點名稱顯示。使用VBScript遍歷XML文件中的所有節點

下面是我的代碼:

<html> 
<head> 
</head> 
<body> 

<script type="text/vbscript"> 
Set xmlDoc=CreateObject("Microsoft.XMLDOM") 
xmlDoc.async="false" 
xmlDoc.load("test.xml") 
Dim objDocElem, strNode, strSubNode, xmlnn, xmlnv, xmlnc, xmldd, xmlfd, xmlfv 

Set n_firstchild = xmldoc.documentElement.firstChild 
Set p_node = n_firstchild.parentNode 
Set pn_attribs = p_node.attributes 
For Each pnAttr in pn_attribs 
    xmlfd = xmlfd & pnAttr.name & chr(9) 
    xmlfv = xmlfv & pnAttr.value & chr(9) 
Next 

Set objDocElem=xmlDoc.documentElement 

Set y = objDocElem.childNodes 
i=0 
Do While i < y.length 
If y(i).nodeType <> 3 Then 
    If Isnull(y(i).childNodes(0).nodeValue) Then 
    xmlnv = xmlnv & "Category" & chr(9) 
    Else 
    xmlnv = xmlnv & y(i).childNodes(0).nodeValue & chr(9) 
    End If 
    xmlnn = xmlnn & y(i).nodeName & chr(9) 
    xmlnc = xmlnc + 1 
    z=0 
    Do While z < y(i).childNodes.length 
    If y(i).childNodes(z).nodeType <> 3 Then 
     xmlnc = xmlnc + 1 
     xmlnn = xmlnn & y(i).childNodes(z).nodeName & chr(9) 
     xmlnv = xmlnv & y(i).childNodes(z).text & chr(9) 
    End If 
    z=z+1 
    Loop 
End If 
i=i+1 
Loop 

document.write("form details: " & xmlfd & "<br />") 
document.write("form values: " & xmlfv & "<br /><br />") 
document.write("node names: " & xmlnn & "<br />") 
document.write("node values: " & xmlnv & "<br />") 
document.write("<br />node count: " & xmlnc & "<br />") 

</script> 
</body> 
</html> 

和XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<form penid="AJX-AAE-CRB-7P" submitted="2009-09-10 14:57:07" updated="2009-09-10 15:05:22" finalised="2009-09-10 15:59:48"> 
    <Forename>Russell</Forename> 
    <Surname>Kilby</Surname> 
    <HouseNumber>248</HouseNumber> 
    <Letter>GRG</Letter> 
    <Products> 
    <WinSoftware>Product One</WinSoftware> 
    <MacSoftware>Product Two</MacSoftware>   
    <LnxSoftware>Product Three</LnxSoftware> 
    <Generic> 
     <Product1>Speedo</Product1> 
     <Product2>Switches</Product2> 
     <Product3>BIOS</Product3> 
     <TestOne> 
      <Panel1>Front</Panel1> 
      <Panel2>Back</Panel2> 
      <Panel3>Middle</Panel3> 
     </TestOne> 
    </Generic> 
    <Hardware>Fender</Hardware> 
    </Products> 
    <HouseName>Just Tea House</HouseName> 
    <PostCode>B87 7DF</PostCode> 
    <Insurer>ABC Cars</Insurer> 
    <PolicyNumber>FDA 8D3JD7K</PolicyNumber> 
    <Make>Ford</Make> 
    <VehicleReg>EX51 CBA</VehicleReg> 
    <DescriptionOfDamage>Big smash on the from</DescriptionOfDamage> 
    <Estimate>1300</Estimate> 
    <AlertManager>Yes</AlertManager> 
</form> 
+0

這將有助於大規模如果您發佈所需的輸出,所以我們不必設想你期望的是什麼,我們可以在很大程度上忽略你的代碼,並顯示你應該怎麼做。 – AnthonyWJones 2009-12-15 16:20:06

回答

6

請試試這個:

set nodes = xmlDoc.selectNodes("//*")  
for i = 0 to nodes.length 
    document.write(nodes(i).nodeName & " - " & nodes(i).text & "<br />") 
next 
+1

謝謝魯本斯。這對我非常有幫助。我所需要的只是朝着正確的方向輕推。比AnthonyW瓊斯的愚蠢評論更有建設性。 – 2009-12-15 17:13:21

+1

不知何故,他得到了一個觀點:你真的應該學習XPath。當您放棄DOM導航並開始直接跳轉數據時,XML會變得更加有趣。 XPath起初看起來很可怕,但是在兩天之內那種感覺就消失了=) – 2009-12-15 17:24:07

+0

^兩天^兩年。但是如果你想學習xpath,請嘗試http://xpathvisualizer.codeplex.com(僅適用於Windows) – Cheeso 2009-12-24 17:22:09