2009-12-15 67 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