Jewtus Posted August 28, 2015 Posted August 28, 2015 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 EndIfAll 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?
Jewtus Posted August 28, 2015 Author Posted August 28, 2015 (edited) 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:expandcollapse popup$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 August 28, 2015 by Jewtus
Jewtus Posted August 28, 2015 Author Posted August 28, 2015 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 NextIs there a simpler way to do this? I tried using$oRep.selectNodes("phone")[0].TextBut that errors out.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now