2016-09-19 81 views
1

我是新来的VB6,并与不同深度的标签,如以下面的例子来解析XML文档:如何解析XML文件在VB6递归

<start> 
    <b>text1</b> 
    <c> 
    <c1> 
     <d>text</d> 
    </c1> 
    </c> 
</start> 

我使用MSXML和试图解决这个问题的递归。我的代码是:

Sub1() 
    Set objXML = CreateObject("Msxml.DOMDocument") 
    objXML.async = True 
    objXML.Load "text.xml" 

    Dim nodeList As IXMLDOMNodeList 
    Dim node As IXMLDOMNode 

    Set nodeList = objXML.selectNodes("*") 

    For Each node In nodeList 
    print node.nodeName ' this works' 
    printNode (node)  'here is the problem explained below' 
    Next node 
End Sub 


Sub printNode(node As IXMLDOMNode) 
    Dim xmlNode As IXMLDOMNode 
    If node.hasChildNodes Then 
    For Each xmlNode In node.childNodes 
     printNode (xmlNode) 
    Next xmlNode 
    Print node.nodeName 
    End If 
End Sub 

的问题是,它是不可能调用子printNode型IXmlDomNode的参数节点。当我尝试运行该程序,我总是得到一个runtimeerror 438它说对象不支持此功能

节点确实存在,我测试了这一点,并可以打印的名称和节点的值。

任何人都可以解释我的原因,并给我一个提示如何/解决方案我可以如何解决这个问题?

+0

你不解析任何东西。您已经要求MSXML进行解析。你似乎在努力穿越DOM。 – Bob77

+0

你说得对。感谢您纠正我,我的描述在这一点上并不完全正确。问题是遍历DOM – moony

回答

3

您的代码中有语法错误。如果你正在调用一个Sub,你可以这样做,而不用将括起来的参数括起来,或者你可以在Sub名称前面使用Call Keyword。

Public Sub Sub1() 
    Set objXML = CreateObject("Msxml.DOMDocument") 
    objXML.async = True 
    objXML.Load "text.xml" 

    Dim nodeList As IXMLDOMNodeList 
    Dim node As IXMLDOMNode 

    Set nodeList = objXML.selectNodes("*") 

    For Each node In nodeList 
     print node.nodeName ' this works' 
     Call printNode(node)  'here is the problem explained below' 
    Next node 
End Sub 

Public Sub printNode(node As IXMLDOMNode) 
    Dim xmlNode As IXMLDOMNode 

    If node.hasChildNodes Then 
     For Each xmlNode In node.childNodes 
      Call printNode(xmlNode) 
     Next xmlNode 
     Print node.nodeName 
    End If 
End Sub 
+0

好的,谢谢,如果你知道这很容易。你知道为什么有两种方法(带有palenthesis而没有它们)在vb6中调用** sub **吗?当你来自** java ** – moony

+0

这样的语言时,这是非常不寻常的,但我猜想它可以追溯到语言的起源。 Visual Basic始终保留一些原始语言功能,以保持向后兼容性。 – jac