Go Back   Forum Care Forums > Development Reference Area > Visual Basic

Reply
 
LinkBack Thread Tools Display Modes
Walking the DOM with VB6
Old
  (#1)
Who Cares
Guest
 
Posts: n/a
Default Walking the DOM with VB6 - 06-04-2007, 09:45 AM

Okay, this may be a bit of a newbie question but I could really use some
help.

I want to write a set of routines that will read in the contents of XML
files. I'll be reading the tag names, attributes and data into other
interfaces, stuffing arrays, loading trees, etc.

I will not know the structure of these files ahead of time. Some values may
have attributes, some may or may not have children and I will not know how
many deep these tags pairs may go.

I can start walking the DOM and check at each level how many siblings are
there, if any tags have attributes and if they have children etc but how do
I next these tests when I don't know how many levels deep I'll need to go?

Here is my ruff and inadequate start:

Dim xmlDoc As New DOMDocument
Dim oNode As IXMLDOMNode
Dim oNodeList As IXMLDOMNodeList
Dim lCnt As Long
Dim lNodeListLen As Long
Dim bHasChildren As Boolean

xmlDoc.async = False
xmlDoc.validateOnParse = True
xmlDoc.resolveExternals = True
xmlDoc.Load (App.Path & "\MyFile.xml")

bHasChildren = False

Set oNode = xmlDoc.firstChild
PrintNodeInfo oNode 'This is just a routine to print out the values
' I could of course be loading the
values into other things

Set oNodeList = xmlDoc.childNodes

lNodeListLen = oNodeList.length

For lCnt = 0 To lNodeListLen - 1
PrintNodeInfo oNode
bHasChildren = oNodeList.Item(lCnt).hasChildNodes

If bHasChildren = True Then
MsgBox "Has kids!" ' From here I would need to dig deeper
and keep evaluating
Else
MsgBox "No Kids!"
End If

Next lCnt

I can't use counters this way because I would not know how many different
counters I'll need to go the number of levels deep I need to go.

There must be some other way to do this.

Thanks in advance for ***istance.

-John


   
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

Re: Walking the DOM with VB6
Old
  (#2)
Eddie B
Guest
 
Posts: n/a
Default Re: Walking the DOM with VB6 - 06-04-2007, 09:45 AM

You would probably have to construct a do while loop. Not real good
on XML, so someone else here might give a better answer. I would read
the XML file as a text file, and rebuild the structure in arrays,
getting the info you want.

What do you want to get out of this - that will decide the best way to
go about decoding the XML file.

BTW VB.Net has the ability to read and decode the XML files for you,
just a thought

On Fri, 13 Aug 2004 03:50:13 GMT, "Who Cares" <EMAIL REMOVED> wrote:

>Okay, this may be a bit of a newbie question but I could really use some
>help.
>
>I want to write a set of routines that will read in the contents of XML
>files. I'll be reading the tag names, attributes and data into other
>interfaces, stuffing arrays, loading trees, etc.
>
>I will not know the structure of these files ahead of time. Some values may
>have attributes, some may or may not have children and I will not know how
>many deep these tags pairs may go.
>
>I can start walking the DOM and check at each level how many siblings are
>there, if any tags have attributes and if they have children etc but how do
>I next these tests when I don't know how many levels deep I'll need to go?
>
>Here is my ruff and inadequate start:
>
>Dim xmlDoc As New DOMDocument
>Dim oNode As IXMLDOMNode
>Dim oNodeList As IXMLDOMNodeList
>Dim lCnt As Long
>Dim lNodeListLen As Long
>Dim bHasChildren As Boolean
>
>xmlDoc.async = False
>xmlDoc.validateOnParse = True
>xmlDoc.resolveExternals = True
>xmlDoc.Load (App.Path & "\MyFile.xml")
>
>bHasChildren = False
>
>Set oNode = xmlDoc.firstChild
>PrintNodeInfo oNode 'This is just a routine to print out the values
> ' I could of course be loading the
>values into other things
>
>Set oNodeList = xmlDoc.childNodes
>
>lNodeListLen = oNodeList.length
>
> For lCnt = 0 To lNodeListLen - 1
> PrintNodeInfo oNode
> bHasChildren = oNodeList.Item(lCnt).hasChildNodes
>
> If bHasChildren = True Then
> MsgBox "Has kids!" ' From here I would need to dig deeper
>and keep evaluating
> Else
> MsgBox "No Kids!"
> End If
>
> Next lCnt
>
>I can't use counters this way because I would not know how many different
>counters I'll need to go the number of levels deep I need to go.
>
>There must be some other way to do this.
>
>Thanks in advance for ***istance.
>
>-John
>


   
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Re: Walking the DOM with VB6
Old
  (#3)
Who Cares
Guest
 
Posts: n/a
Default Re: Walking the DOM with VB6 - 06-04-2007, 09:45 AM

Eddie,

Thanks for the reply. Actually I'm sure I don't want to just parse a
string. I can't use VB.Net in this case because the Framework is just to
big <grin>.

Actually I've gotten closer. I just want to process unlimited depths of XML
nodes, get all the tag names, any attributes and data within the tags.
Since I've gotten closer I'll post my code.

Again, I appreciate any ***istance. Please be kind to the newbie <smile>.

-John


Option Explicit

Dim bHasKids As Boolean
Dim bSuccess As Boolean
Dim oNodeList() As IXMLDOMNodeList
Dim oNodeListPointer As IXMLDOMNodeList
Dim oNode() As IXMLDOMNode

Private Sub Form_Load()
Dim xmlDoc As New DOMDocument
Dim root As IXMLDOMElement
Dim lCntNode As Long
Dim lCntList As Long

xmlDoc.async = False
xmlDoc.Load (App.Path & "\MyXMLFile.xml")

ReDim Preserve oNodeList(1)
ReDim Preserve oNode(1)

Set root = xmlDoc.documentElement
Set oNodeList(0) = root.childNodes

lCntNode = 0
lCntList = 0

For Each oNode(lCntNode) In oNodeList(lCntList)
bHasKids = GetNodeInfo(oNode(lCntNode))

If oNode(lCntNode).hasChildNodes = True Then

LowerNode lCntList, lCntNode

Set oNodeListPointer = oNode(lCntNode - 1).childNodes
bSuccess = ProcessSubNodes(oNodeListPointer)

RaiseNode lCntNode

End If

Next

Unload Form1
End
End Sub

Private Sub LowerNode(ByRef lCntList As Long, ByRef lCntNode As Long)

lCntList = lCntList + 1
lCntNode = lCntNode + 1
ReDim Preserve oNodeList(lCntList)

End Sub
Private Sub RaiseNode(ByRef lCntNode As Long)
lCntNode = lCntNode - 1
End Sub

Private Function ProcessSubNodes(ByVal oNodeList As IXMLDOMNodeList) As
Boolean
Dim i As Long
Dim lAttrib As Long


For i = 0 To oNodeList.length - 1
' bHasKids = GetNodeInfo(oNodeList.Item(i))

' Debug
lAttrib = oNodeList.Item(i).Attributes.length

If lAttrib >= 1 Then
Debug.Print " Attribute Found: "
& """" & _

oNodeList.Item(i).Attributes.Item(0).nodeValue & """"
End If

If oNodeList.Item(i).hasChildNodes = True Then
bHasKids = True
Else
bHasKids = False
End If


Next

End Function

Private Function GetNodeInfo(ByVal Item) As Boolean
Dim lAttrib As Long

Debug.Print "Base Name: " & """" & Item.baseName & """" & _
" Value: " & """" & Item.firstChild.nodeValue & """" &
_
" Has Child Nodes?: " & """" & Item.hasChildNodes &
""""


End Function






<Eddie B> wrote in message
news:EMAIL REMOVED...
> You would probably have to construct a do while loop. Not real good
> on XML, so someone else here might give a better answer. I would read
> the XML file as a text file, and rebuild the structure in arrays,
> getting the info you want.
>
> What do you want to get out of this - that will decide the best way to
> go about decoding the XML file.
>
> BTW VB.Net has the ability to read and decode the XML files for you,
> just a thought
>
> On Fri, 13 Aug 2004 03:50:13 GMT, "Who Cares" <EMAIL REMOVED> wrote:
>
> >Okay, this may be a bit of a newbie question but I could really use some
> >help.
> >
> >I want to write a set of routines that will read in the contents of XML
> >files. I'll be reading the tag names, attributes and data into other
> >interfaces, stuffing arrays, loading trees, etc.
> >
> >I will not know the structure of these files ahead of time. Some values

may
> >have attributes, some may or may not have children and I will not know

how
> >many deep these tags pairs may go.
> >
> >I can start walking the DOM and check at each level how many siblings are
> >there, if any tags have attributes and if they have children etc but how

do
> >I next these tests when I don't know how many levels deep I'll need to

go?
> >
> >Here is my ruff and inadequate start:
> >
> >Dim xmlDoc As New DOMDocument
> >Dim oNode As IXMLDOMNode
> >Dim oNodeList As IXMLDOMNodeList
> >Dim lCnt As Long
> >Dim lNodeListLen As Long
> >Dim bHasChildren As Boolean
> >
> >xmlDoc.async = False
> >xmlDoc.validateOnParse = True
> >xmlDoc.resolveExternals = True
> >xmlDoc.Load (App.Path & "\MyFile.xml")
> >
> >bHasChildren = False
> >
> >Set oNode = xmlDoc.firstChild
> >PrintNodeInfo oNode 'This is just a routine to print out the values
> > ' I could of course be loading the
> >values into other things
> >
> >Set oNodeList = xmlDoc.childNodes
> >
> >lNodeListLen = oNodeList.length
> >
> > For lCnt = 0 To lNodeListLen - 1
> > PrintNodeInfo oNode
> > bHasChildren = oNodeList.Item(lCnt).hasChildNodes
> >
> > If bHasChildren = True Then
> > MsgBox "Has kids!" ' From here I would need to dig deeper
> >and keep evaluating
> > Else
> > MsgBox "No Kids!"
> > End If
> >
> > Next lCnt
> >
> >I can't use counters this way because I would not know how many different
> >counters I'll need to go the number of levels deep I need to go.
> >
> >There must be some other way to do this.
> >
> >Thanks in advance for ***istance.
> >
> >-John
> >

>



   
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On





Contact Us - Forum Care Forums - Archive - Top