2016-09-19 4 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, вы либо делаете это без включения параметров в скобках, либо используете ключевое слово Call перед именем Sub.

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

Хорошо, спасибо, если вы это знаете, это довольно просто. Знаете ли вы, почему есть два способа (с паретингом и без них) называть ** sub ** в vb6? Это довольно необычно, когда вы исходите из такого языка, как ** java ** – moony

+0

Я этого не делаю, но я бы предположил, что это можно проследить до происхождения языка. Visual Basic всегда обладал некоторыми из оригинальных функций языка, которые остались в обратной совместимости. – jac

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