Jump to content

Struggling with XML parsing


 Share

Recommended Posts

I'm trying to parse an XML file and assign all the elements to various variables to loop through. I've tried using the XMLDomWrapper but that is confusing me even more than just working directly (this is my first time really working with XML)

This is the XML example:

<?xml version='1.0' encoding='UTF-8'?>
<Requests count="1" created="20110412154312">
<request endDate="201104" id="52084" retransmit="N" startDate="200903" submitted="20110412">
    <Rep>
        <lastName>Request</lastName>
        <middleName>R</middleName>
        <firstName>Test</firstName>
        <address>125 West 125th Street, 5th Floor</address>
        <city>New York</city>
        <state>NY</state>
        <zip>12345</zip>
        <phone>555-555-555</phone>
    </Rep>
    <accounts>
        <account Deposit="N">123456</account>
        <account Deposit="N">652983</account>
        <remarks>This is an example.</remarks>
    </accounts>
</request>
</Requests>

I've tried using the following scripts:

$oXML = ObjCreate("MSXML2.DOMDocument")
    ;~ $oXML.loadXML(ClipGet())
    $oXML.load($filename)
    $oXML.setProperty("SelectionLanguage", "XPath")

    ConsoleWrite("!-----------------------------------------------------------------------------------" & @LF & @LF)
    For $oDirectoryRef In $oXML.selectNodes("Requests")
        $sCount= $oDirectoryRef.getAttribute("count")
ConsoleWrite($sCount&@CRLF)
        For $oComponent In $oDirectoryRef.selectNodes("request")
            $sCompID = $oComponent.getAttribute("id")
            $sCompstart = $oComponent.getAttribute("startDate")
            $sCompend = $oComponent.getAttribute("endDate")
ConsoleWrite($sCompID&"|"&$sCompstart&"|"&$sCompend&@CRLF)
            For $oRep In $oComponent.selectNodes("Rep")
                $sRepFName = $oRep.getAttribute("firstName").value
                $sRepMName = $oRep.getAttribute("middleName")
                $sRepLName = $oRep.getAttribute("lastName")
                $sRepAddr = $oRep.getAttribute("address")
                $sRepCity = $oRep.getAttribute("city")
                $sRepState = $oRep.getAttribute("state")
                $sRepZip = $oRep.getAttribute("zip")
                $sRepPhone = $oRep.getAttribute("phone")
ConsoleWrite($sRepFName&"|"&$sRepMName&"|"&$sRepLName&"|"&$sRepAddr&"|"&$sRepCity&"|"&$sRepState&"|"&$sRepZip&"|"&$sRepPhone&@CRLF)
            Next
            For $oAccount In $oComponent.selectNodes("accounts")
                $sDirect = $oAccount.getAttribute("Deposit")
ConsoleWrite($sDirect&@CRLF)
            Next
        Next
    Next
    ConsoleWrite("!---------------------------------------------------------------------------------" & @LF & @LF)

This is the code I've tried using The dom wrapper:

If _XMLFileOpen($filename) Then
        Local $aRoot = _XMLGetChildNodes('/*')
        If Not @error Then
            For $i = 1 To $aRoot[0]
                ConsoleWrite($aRoot[$i] & @LF)
                Local $aRequest = _XMLGetChildNodes('/*/'&$aRoot[$i])
                If Not @error Then
                    For $j = 1 To $aRequest[0]
                        ConsoleWrite(@TAB&$aRequest[$j] & @LF)
                    Next
                EndIf
            Next
        EndIf
    EndIf

All I really want to do is grab the elements and put them in arrays for each of the nodes (putting the values... like direct... as the first line of the array).

 

I know I'm calling the last elements with the wrong function, but I cannot seem to figure out which function I need. I also don't quite understand how to get the value of the node and the elements in the node. Could someone point me in the right direction?

Link to comment
Share on other sites

I'm getting a little further but I am struggling to figure out how to get the innertext for a node... nodeValue, value, text, innertext, none of them are working, but text does pull back the value of the account node correctly but not on any of the others:

$oXML = ObjCreate("MSXML2.DOMDocument")
    ;~ $oXML.loadXML(ClipGet())
    $oXML.load($filename)
    $oXML.setProperty("SelectionLanguage", "XPath")

    ConsoleWrite("!-----------------------------------------------------------------------------------" & @LF & @LF)
    For $oDirectoryRef In $oXML.selectNodes("Requests")
        $sCount= $oDirectoryRef.getAttribute("count")
        $sCreated= $oDirectoryRef.getAttribute("created")
ConsoleWrite("Root: "&$sCount&"|"&$sCreated&@CRLF)
        For $oComponent In $oDirectoryRef.selectNodes("request")
            $sCompID = $oComponent.getAttribute("id")
            $sCompstart = $oComponent.getAttribute("startDate")
            $sCompend = $oComponent.getAttribute("endDate")
ConsoleWrite("Components: "&$sCompID&"|"&$sCompstart&"|"&$sCompend&@CRLF)
            For $oRep In $oComponent.selectNodes("Rep")
                $sRepFName = $oRep.getAttribute("firstName")
                $sRepMName = $oRep.getAttribute("middleName")
                $sRepLName = $oRep.getAttribute("lastName")
                $sRepAddr = $oRep.getAttribute("address")
                $sRepCity = $oRep.getAttribute("city")
                $sRepState = $oRep.getAttribute("state")
                $sRepZip = $oRep.getAttribute("zip")
                $sRepPhone = $oRep.getAttribute("phone")
ConsoleWrite("Rep: "&$sRepFName&"|"&$sRepMName&"|"&$sRepLName&"|"&$sRepAddr&"|"&$sRepCity&"|"&$sRepState&"|"&$sRepZip&"|"&$sRepPhone&@CRLF)
            Next
            For $oAccounts In $oComponent.selectNodes("accounts")
                For $oAccount In $oAccounts.selectNodes("account")
                    $sDirect = $oAccount.getAttribute("Deposit")
                    $sActNumb = $oAccount.Text
ConsoleWrite("Account: "&$sDirect&"|"&$sActNumb&@CRLF)
                Next
                $sRemarks = $oAccounts.getAttribute("remarks")
ConsoleWrite("Remarks: "&$sRemarks&@CRLF)
            Next
        Next
    Next
    ConsoleWrite("!---------------------------------------------------------------------------------" & @LF & @LF)

 

Edited by Jewtus
Link to comment
Share on other sites

Figured it out. When I run a for loop with the objects (even if there is only 1) it seems to work.

For $o in $oRep.selectNodes("firstName")
                    $sRepFName=$o.Text
                Next
                For $o in $oRep.selectNodes("middleName")
                    $sRepMName=$o.Text
                Next
                For $o in $oRep.selectNodes("lastName")
                    $sRepLName=$o.Text
                Next
                For $o in $oRep.selectNodes("address")
                    $sRepAddr=$o.Text
                Next
                For $o in $oRep.selectNodes("city")
                    $sRepCity=$o.Text
                Next
                For $o in $oRep.selectNodes("state")
                    $sRepState=$o.Text
                Next
                For $o in $oRep.selectNodes("zip")
                    $sRepZip=$o.Text
                Next
                For $o in $oRep.selectNodes("phone")
                    $sRepPhone=$o.Text
                Next

Is there a simpler way to do this? I tried using

$oRep.selectNodes("phone")[0].Text

But that errors out.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...