Consulting

Results 1 to 1 of 1

Thread: VBA Access: Parsing XML Contents to Table

  1. #1
    VBAX Newbie
    Joined
    Apr 2013
    Posts
    1
    Location

    VBA Access: Parsing XML Contents to Table

    Hello everyone

    I'm having some major head banging on this project.


    First and foremost: This Access table is different. It is different in that USUALLY values or data, are made in rows. In this case, each row lists a tag or element/attribute, and what is to be put in the attribute/element value is in a column named Values. Please see my example image below:
    h*tp://i.imgur.com/a7yBuNX.jpg

    Now what I need to do is to somehow automate the reading of an XML to take in the tags, this includes the elements and the attributes for the elements. The thing is, there are WAY more elements/attributes on the table than the ones that are in the XML, so it's possible to have all, some, or none. So what I need to do have it pull the elements that are inputted - if it has a value attached to it, put the value in the "Values" column. After detecting the element we need to detect attributes for said element, and apply any values for them onto the Values column for that respective attribute/element as well.

    I have been told to use the GetelementByTag feature, however that is really making me scratch my head. How I am currently trying to do it is simply by pulling all the nodes, and then looping through the recordset of Attributes/Elements (which is over 400 in total!) to see if it matches. I REALLY think this is the wrong way to go about it altogether

    Given my inexperience, can someone either show a different way, or tell me what I am doing wrong?

    The current bug I am at with my code is that when RecordSet("Element/Attribute") = objNode.nodeName, it tries to change the RecordSet.Values to = objNode.nodeValue, however nodeValue is null so it stops the program? Which I guess is possible, XML tags that are there with no value but just have the tags is often. Many times, the element is present with no value because they are the parent child for an attribute that DOES have a value.

    Below is my Code, any help is mucho appreciated

    Public Sub Command0_Click()
    Dim rs As DAO.Recordset
    Dim strXML As String
    Dim strSQL As String
    Dim Resp As New DOMDocument
    Dim objNodeList As IXMLDOMNodeList
    Dim objAttribute As IXMLDOMAttribute
    Dim objChildNodes As IXMLDOMNodeList
    Dim rsAttributes As MSXML2.IXMLDOMNamedNodeMap
    Dim xmlDoc As MSXML2.DOMDocument
    Dim x As Integer
    Dim db As DAO.Database
     
    Set db = CurrentDb()
    Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    'db.Execute ("ALTER TABLE InvoiceResponse ADD COLUMN Values String")
     
        strSQL = "SELECT [ID], [Level], [Element/Attribute], [Occurs], [Data Type], Description FROM InvoiceResponse"
     
        Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
     
        Dim obj As MSXML2.DOMDocument
        Set obj = New MSXML2.DOMDocument
        obj.Load ("C:\users\username\documents\vertex\Transaction Tester\test.xml")
        Dim xmlElement As MSXML2.IXMLDOMElement
        Dim xmlNode As MSXML2.IXMLDOMElement
     
        Nodebuilder obj.childNodes, rs
     
        End Sub

    Sub Nodebuilder(ByRef objNodeList As IXMLDOMNodeList, ByRef rs As DAO.Recordset)
     
        Dim objNode As IXMLDOMNode
     
            For Each objNode In objNodeList
     
     
            Do Until rs.EOF
            If rs("Element/Attribute").Value = objNode.nodeName Then
                rs.Edit
                rs("Values").Value = objNode.nodeValue
                rs.Update
                Else
                rs.MoveNext
     
                End If
     
            Loop
     
         If objNode.hasChildNodes Then
            Nodebuilder objNode.childNodes, rs
         End If
     
         Next objNode
     
        End Sub
    Last edited by cyraxx; 04-25-2013 at 07:15 AM.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •