Jump to content
Sign in to follow this  
Jewtus

Struggling with XML parsing

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?

Share this post


Link to post
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

Share this post


Link to post
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.

Share this post


Link to post
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
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By rudi
      Hello,
      once more I have to see, that my knowledge about XML is too poor, even to use this existing XML UDF
      If it should be a better approach to make use of StringRegEx, or maybe a totally different approach, any suggestions will be mostly appreciated.
       
      I downloaded the ZIP XML_1.1.1.13 and tried to get how to use it from the sample AU3 files included in that ZIP file, well, I don't really get it😵
       
       
      What I want to do:
      My mobile phone's backup contain all the contacts in an XML file. This is an example of such a file, backupinfo.xml, shortened to show just one fictive entry:
       
      <?xml version="1.0" encoding="utf-8" ?> <ContactRecords> <contact> <structuredName> <displayName>Max Mustermann</displayName> <givenName>Max</givenName> <familyName>Mustermann</familyName> <prefixName /> <middleName /> <suffixName /> <phoneticGivenName /> <phoneticMiddleName /> <phoneticFamily /> </structuredName> <organization> <company>Schlosserei Mustermann GmbH</company> <department /> <title /> </organization> <phones> <phone> <number>07652 881 8181</number> <type>home</type> <customLabel /> </phone> <phone> <number>0 800 435 2758</number> <type>work</type> <customLabel /> </phone> <phone> <number>+49 160 4321 222</number> <type>mobile</type> <customLabel /> </phone> </phones> <emails /> <addresses /> <ims /> <WebSites /> <Events /> <note /> <nickName /> <photo /> <netPhone /> <groups> <group> <groupName>Ungrouped</groupName> </group> </groups> </contact> </ContactRecords>  
      Basically I want to search my mobile's contacts for phone numbers to, to see, what contact they belong to. Propably it will make the task much more easy, when standardizing the mobile's contact XML to hold all numbers in "international-notation-without-any-whitespaces" (thats no problem):
       
      <?xml version="1.0" encoding="utf-8" ?> <ContactRecords> <contact> <structuredName> <displayName>Max Mustermann</displayName> <givenName>Max</givenName> <familyName>Mustermann</familyName> <prefixName /> <middleName /> <suffixName /> <phoneticGivenName /> <phoneticMiddleName /> <phoneticFamily /> </structuredName> <organization> <company>Schlosserei Mustermann GmbH</company> <department /> <title /> </organization> <phones> <phone> <number>+4976528818181</number> <type>home</type> <customLabel /> </phone> <phone> <number>+498004352758</number> <type>work</type> <customLabel /> </phone> <phone> <number>+491604321222</number> <type>mobile</type> <customLabel /> </phone> </phones> <emails /> <addresses /> <ims /> <WebSites /> <Events /> <note /> <nickName /> <photo /> <netPhone /> <groups> <group> <groupName>Ungrouped</groupName> </group> </groups> </contact> </ContactRecords>  
      What I would like to get from the XML file as a result, e.g. searching the phone number "+491604321222"
      Present in XML  or not (true) if present then return the values for... type (mobile) givenname (Max) familyname (Mustermann) company (Schlosserei Mustermann GmbH) optional: Other node names and their values within that contact, when not "empty" (like in this examle <emails /> or <middlename />)  
      The values from #2 - #6 would be perfect when returned in a 2D Array, Col0 = name, Col1 = value.
      Regards, Rudi.
       
    • By VinMe
      Dear all, i am unable to open a xml file to excel in the "xml table format" Please help me out in where i am missing
      Local $strFileToOpen = _WinAPI_OpenFileDlg('Select xml file', @WorkingDir, 'All Files(*.*)', 1, '', '', BitOR($OFN_PATHMUSTEXIST, $OFN_FILEMUSTEXIST, $OFN_HIDEREADONLY)) Global $xlXmlLoadImportToList = 2 ; Places the contents of the XML data file in an XML table $oExcel = _Excel_Open() $oWorkbook1=$oExcel.Workbooks.OpenXML($strFileToOpen, "", $xlXmlLoadImportToList) If $strFileToOpen <> False Then     Local $oWorkbook1 = _Excel_BookOpen($oExcel, $strFileToOpen) EndIf Error i am getting is:
      ......\81e_Compare_v1.au3" (46) : ==> The requested action with this object has failed.:
      $oWorkbook1=$oExcel.Workbooks.OpenXML($strFileToOpen, "", $xlXmlLoadImportToList)
      $oWorkbook1=$oExcel.Workbooks^ ERROR
      >Exit code: 1    Time: 7.338
    • By ijourneaux
      I have been using the XML UDF successfully for sometime. I am now tring to add in error handling for some bad XML files I run into.
      $oXmlDoc = _XML_CreateDOMDocument(Default) _XML_Load($oXmlDoc,$sFileXML) ;<== ENTER XML FILE PATH HERE If @error Then ; ConsoleWrite(StringFormat("_XML_load error - @error = %s", @error) & @CRLF) ; ConsoleWrite("-" & $sFileXML & @CRLF) Exit -1 EndIf ConsoleWrite("-" & $sFileXML & @CRLF) ;If no specified nodes exist, log error and exit If Not _XML_NodeExists($oXmlDoc, "//Property") Then ; ConsoleWrite("No specified nodes exist" & @CRLF) Exit -1 EndIf ;Get number of Property nodes $oProperties = _XML_SelectNodes($oXmlDoc,"//Property/Data") $iNodeCount = @extended $oParents = $oXmlDoc.SelectSingleNode("//Property[@Name='Parents']/Data") There are no error upto this point. The XML file I am trying to handle has a Data node but when I try to
      $sParam = StringSplit($oParents.text, ";") I get a fatal error (requested action on object failed). How can I test for the problem before I try to do the string split? I tried using @error, and testing $oParents but no luck.
      Appreciate any tips.
    • By ijourneaux
      I am trying to read an XML file that looks like the following. I am particularly interested in the ParameterNames and ParameterValues
       
      I was able to read a simplier XML file using
      $oXML.load("DataForwardSettings.xml") Local $oInfos = $oXML.selectnodes("//Database") ; or //Info or //Data//Info or //Values/Info  but have not been able to read
      <?xml version="1.0"?> <Entities> <Entity RecordType="TrendData"> <Property Name="AlarmLimitsSetNumber" IsReadOnly="False" ValueType="System.Int32">8</Property> <Property Name="AnalysisParamaterSetNumber" IsReadOnly="False" ValueType="System.Int32">8</Property> <Property Name="ParameterNames" IsReadOnly="True" IsList="True" ListType="List<string>" ValueType="Array" ArrayType="System.String" Count="12">System.Collections.Generic.List`1[System.String]<Data>OVERALL|PK-PK WAVEFORM|HFD|CREST FACTOR|SYNC 1-6|1X|2X|3X-4X|FTF|BSF|BPFO|BPFI</Data></Property> <Property Name="ParameterValues" IsReadOnly="True" IsList="True" ListType="List<float>" ValueType="Array" ArrayType="System.Single" Count="12">System.Collections.Generic.List`1[System.Single]<Data>0.04706,0.27951,0.02640,4.85608,0.03494,0.01727,0.02256,0.01993,0.00207,0.00060,0.00178,0.00221</Data></Property> <Property Name="NumberOfParameters" IsReadOnly="False" ValueType="System.Int32">12</Property> <Property Name="ModifiedSinceLastDataDump" IsReadOnly="False" ValueType="System.Boolean">False</Property> <Property Name="Load" IsReadOnly="False" ValueType="System.Single">0</Property> <Property Name="RPM" IsReadOnly="False" ValueType="System.Single">140.962</Property> <Property Name="Value" IsReadOnly="False" ValueType="System.Single">-1.1E-20</Property> <Property Name="SampleID" IsReadOnly="False" ValueType="System.Int32">-626794</Property> <Property Name="Timestamp_as_String" IsReadOnly="True" ValueType="System.String">8/18/2018 2:05:33 PM</Property> <Property Name="Timestamp_as_UInt" IsReadOnly="False" ValueType="System.UInt32">1534619133</Property> <Property Name="Timestamp" IsReadOnly="False" ValueType="System.DateTime">8/18/2018 2:05:33 PM</Property> <Property Name="StorageFlag" IsReadOnly="False" ValueType="Enum" EnumType="Emerson.CSI.DataImport.MHM.TrendDataStorageType" EnumValue="2">RPM_And_Overall</Property> <Property Name="Parents" IsReadOnly="False" IsList="True" ListType="List<string>" ValueType="Array" ArrayType="System.String" Count="5">System.Collections.Generic.List`1[System.String]<Data>Database=phmhmdb4ts;C:\RBMdbsrv\CustData\4ts_online_1807.rbm;-99|Area=4TS;-494|Equipment=4THTS;-712|MeasurementPoint=D39;-780|DataCollectionSet=Normal Collection Dryer Rolls;-783</Data></Property> </Entity> </Entities> I tried switching to the XML UDF but was alittle lost in how to use it. I am particularly interested in the ParameterNames and ParameterValues.
    • By macran
      I want to generating a XML file (test.xml) like as follow:
      <?xml version="1.0" encoding="GBK"?>
      <!DOCTYPE SCHEMA SYSTEM "HGWSPZJK.dtd">  ;I can not generate this line
      <SCHEMA CRC="HGWSPZ201808_9131011571786229XM_CRC.XML" SSSQ="201808" CHSNAME="HGWSDKQD" NAME="HGWSPZ">

      <TAXPAYER CJRMC="sigmagroup" CJRDM="9131011571786229XM" CJLX="DKZK" RECORDCOUNT="411" SBRQ="2018-08-31" NSRMC="sigmagroup" SWSBH="9131011571786229XM">

      <Records>
      <Record BZ="" JKKADM="2244" JKKAMC="shanghai" SE="5907.82" TFRQ="2018-08-23" FPHM="224420181000752586-L02"/>
      <Record BZ="" JKKADM="2244" JKKAMC="shanghai" SE="4742.4" TFRQ="2018-08-21" FPHM="224420181000743016-L01"/>
      <Record BZ="" JKKADM="2244" JKKAMC="shanghai" SE="18720" TFRQ="2018-08-14" FPHM="224420181000719215-L01"/>
      </Records>
      </TAXPAYER>
      </SCHEMA>
      I use XML.UDF  
      Local $oXMLile=_XML_CreateFile(@ScriptDir&"\test.xml","",True) 
      but there is no function CreateDocumentType 
      It is no effort even I test use 
      Local $doct=$oXMLfile.CreateDocumentType("SCHEMA", null, "HGWSPZJK.dtd", null)
            $oXmlfile.appendChild($doct)
      pls help me thanks.
       
       
       
       
       
       
×
×
  • Create New...