2009-12-15 3 views
3

Я написал VBScript, который должен преобразовывать все узлы в файле XML, независимо от глубины дерева. Это делает хорошо , за исключением, что имена узлов для тех узлов, которые имеют глубину 2 или более, не отображаются. Мне нужны имена узлов, а также значения, так что у меня есть пары имя/значение для дальнейшей обработки другими программами. Может кто-нибудь, пожалуйста, помогите мне в отображении недостающих имен узлов.Обход всех узлов в файле XML с помощью VBScript

Ниже мой код:

<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

ответ

6

Пожалуйста, попробуйте следующее:

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

Спасибо Рубенсу. Это очень помогло мне. Все, что мне было нужно, было толчок в правильном направлении. Настолько гораздо конструктивнее, чем отвратительные комментарии AnthonyWJones. –

+1

Каким-то образом он понял: вы действительно должны узнать о XPath. XML становится еще более смешным, когда вы бросаете DOM-навигацию и начинаете прыгать непосредственно на свои данные. XPath кажется пугающим сначала, но через два дня это чувство уходит =) –

+0

^два дня^2 лет. Но если вы хотите изучить xpath, попробуйте http://xpathvisualizer.codeplex.com (только для Windows) – Cheeso

Смежные вопросы