Jump to content
Jewtus

Struggling with XML parsing

Recommended Posts

Jewtus

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
Jewtus

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
Jewtus

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

  • Similar Content

    • ijourneaux
      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.
    • macran
      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.
       
       
       
       
       
       
    • Skeletor
      By Skeletor
      Hi All,
      This is purely an XML Language question. I need to understand how I can add a value/element in between another XML element. 
      Code below shows the XML file. The info tag has the elements already inserted.
      <Configuration xmlns="http://schemas.datacontract.org/2004/07/Modules.Reporting.DataContracts.LineItems" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <GenConf> <Info>ID, Site, Name , Site_ID</Info> </GenConf> </Configuration> Now, I want to add a value from a node group into this code. Something like below. But the example below does not work.
      Any suggestions?
       
      <Configuration xmlns="http://schemas.datacontract.org/2004/07/Modules.Reporting.DataContracts.LineItems" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <GenConf> <Info>ID, Site, a/@id, Name , Site_ID</Info> </GenConf> </Configuration> <ProductName> <a id="Windows Server"/> </ProductName>  
    • bhns
      By bhns
      try it for make flyers old games xml + Gdi, i belive many sources had lost 
      AIT-ADRLIST.au3

    • CosminV
      By CosminV
      Hello guys,
       
      This XML things are driving me crazy...
      Please let me know how can I use the _XMLGetAttrib function... I've tried every possible way that I've read on the forum and I cannot succeed reading an attribute.
       
      The XML looks like bellow:
       
      <?xml version="1.0" encoding="UTF-8"?>
      <BATCH attr1= "aaa" attr2="bbb" attr3="ccc">
           <Node1 attr1="aaa" attr2="bbb" attr3="ccc" attr4="ddd" attr5="" attr6="eee" attr7="fff" attr8="ggg"/>
           <Node2 attr1="aaa" attr2="" attr3="" attr4="ddd"/>
           <Node3 attr1="" attr2="" attr3="ccc" attr4="" attr5="" attr6="eee"/>
           <Panel attr1="aaa" STATUS="BBB" attr3="ccc" attr4="ddd" attr5="" attr6="eee">
                <Node5 attr1="aaa" attr2="bbb" attr3="ccc" attr4="ddd" attr5="" attr6="eee" attr7="fff" attr8="ggg"/>
                .............................................................................................................................................................................
           </Panel>
      </Batch>
       
      I need to read the value of STATUS form the Panel node.
       
      Could you please help me?
       
      Best regards,
      Cococnb
×