Jump to content
lesmly

XML to 1 plus 3 (or more) Arrays

Recommended Posts

Hi, 

First of all - English is not my forte and I apologize in advance for mistakes
secondly - I always try to solve problems myself, but I have not dealt with xml and this problem is beyond my skills, although probably for someone with more skills it is a simple matter, so please help :)

I've got XML and I want to extract data from it into arrays. First array is from <Main> section, next arrays are from <Alternative> section -  number from <CountAlternative> informs how much "alternatives" are. In my xml file example: 1 main and 3 alternatives 

Arrays should look similar:

a) Main Array Columns :

Event(id) NumberPR InfoZ TITLE NumberS NumberT AS1 AS2 AS3 Video AE1 AE2 AE3 AE4 AE5  Copies CodeZ Band *[CD(id) CDN1 CDN2 CDN3 CDN4]

* Number of sets [CD(id) CDN1 CDN1 CDN3 CDN4] for each <Event> is in <NumberOfCD> node - can be from 0 to who knows ;) For simplicity, a maximum of 10 may be assumed, although it is better to check in XML file if possible.

b) Alternative 1 Array Columns:

Event(id) NumberPR InfoZ TITLE NumberS NumberT AS1 AS2 AS3 Video AE1 AE2 AE3 AE4 AE5  Copies CodeZ Band *[CD(id) CDN1 CDN2 CDN3 CDN4]

c) ...

 

If it were to be easier, it could be one array with all data.
 

 

<?xml version="1.0"?>
<AllList>
    <Info>
        <Article>1</Article>
        <Date>20201203</Date>
        <CountMain>4</CountMain>
        <CountAlternative>3</CountAlternative>
            <AlternativeAdded id="1">
                <CountAlternativeEvents>2</CountAlternativeEvents>
            </AlternativeAdded>
            <AlternativeAdded id="2">
                <CountAlternativeEvents>1</CountAlternativeEvents>
            </AlternativeAdded>
            <AlternativeAdded id="3">
                <CountAlternativeEvents>1</CountAlternativeEvents>
            </AlternativeAdded>
    </Info> 
    <Main>
        <Event id="1">
            <NumberPR>00:00:00.00</NumberPR>
            <InfoZ>GB123456</InfoZ>
            <TITLE>Game</TITLE>
            <NumberS>00:00:00.00</NumberS>
            <NumberT>00:10:00.00</NumberT>
            <AddInfo>
                <AS1>D</AS1>
                <AS2>03FF</AS2>
                <AS3>1</AS3>
            </AddInfo>
            <Video>1</Video>
            <AddExtra>
                <AE1>1</AE1>
                <AE2>x</AE2>
                <AE3>0</AE3>
                <AE4>1</AE4>
                <AE5>0</AE5>
            </AddExtra>
            <Copies>30</Copies>
            <CodeZ>2A3B4E8C</CodeZ>
            <Band>1</Band>
            <NumberOfCD>2</NumberOfCD>
                <CD ID="1">
                    <CDN1>10:00:00.00</CDN1>
                    <CDN2>00:00:10.00</CDN2>
                    <CDN3>GAM_XCVFG_ASBCVD</CDN3>
                    <CDN4>3</CDN4>
                </CD>
                <CD ID="2">
                    <CDN1>10:00:00.00</CDN1>
                    <CDN2>00:00:10.00</CDN2>
                    <CDN3>GAM_DEEDS_ASDF</CDN3>
                    <CDN4>3</CDN4>
                </CD>
        </Event>
        <Event id="2">
            <NumberPR>00:00:00.00</NumberPR>
            <InfoZ>BB123456</InfoZ>
            <TITLE>Book</TITLE>
            <NumberS>00:00:00.00</NumberS>
            <NumberT>00:10:00.00</NumberT>
            <AddInfo>
                <AS1>D</AS1>
                <AS2>03FF</AS2>
                <AS3>1</AS3>
            </AddInfo>
            <Video>1</Video>
            <AddExtra>
                <AE1>1</AE1>
                <AE2>x</AE2>
                <AE3>0</AE3>
                <AE4>1</AE4>
                <AE5>0</AE5>
            </AddExtra>
            <Copies>30</Copies>
            <CodeZ>2A3B4E8C</CodeZ>
            <Band>1</Band>
            <NumberOfCD>5</NumberOfCD>
                <CD ID="1">
                    <CDN1>10:00:10.00</CDN1>
                    <CDN2>00:00:10.00</CDN2>
                    <CDN3>BOO_XCVFG_ASBCVD</CDN3>
                    <CDN4>3</CDN4>
                </CD>
                <CD ID="2">
                    <CDN1>10:00:20.00</CDN1>
                    <CDN2>00:00:10.00</CDN2>
                    <CDN3>BOO_EDDE_ASDF</CDN3>
                    <CDN4>3</CDN4>
                </CD>
                <CD ID="3">
                    <CDN1>10:00:30.00</CDN1>
                    <CDN2>00:00:10.00</CDN2>
                    <CDN3>BOO_EDDF_ASDF</CDN3>
                    <CDN4>3</CDN4>
                </CD>
                <CD ID="4">
                    <CDN1>10:00:40.00</CDN1>
                    <CDN2>00:00:10.00</CDN2>
                    <CDN3>BOO_EDDG_ASDF</CDN3>
                    <CDN4>3</CDN4>
                </CD>
                <CD ID="5">
                    <CDN1>10:00:50.00</CDN1>
                    <CDN2>00:00:10.00</CDN2>
                    <CDN3>BOO_EDDH_ASDF</CDN3>
                    <CDN4>3</CDN4>
                </CD>
        </Event>
        <Event id="3">
            <NumberPR>00:00:00.00</NumberPR>
            <InfoZ>BB123456</InfoZ>
            <TITLE>Book</TITLE>
            <NumberS>00:00:00.00</NumberS>
            <NumberT>00:10:00.00</NumberT>
            <AddInfo>
                <AS1>D</AS1>
                <AS2>03FF</AS2>
                <AS3>1</AS3>
            </AddInfo>
            <Video>1</Video>
            <AddExtra>
                <AE1>1</AE1>
                <AE2>x</AE2>
                <AE3>0</AE3>
                <AE4>1</AE4>
                <AE5>0</AE5>
            </AddExtra>
            <Copies>30</Copies>
            <CodeZ>2A3B4E8C</CodeZ>
            <Band>1</Band>
            <NumberOfCD>5</NumberOfCD>
                <CD ID="1">
                    <CDN1>10:00:10.00</CDN1>
                    <CDN2>00:00:10.00</CDN2>
                    <CDN3>BOO_XCVFG_ASBCVD</CDN3>
                    <CDN4>3</CDN4>
                </CD>
                <CD ID="2">
                    <CDN1>10:00:20.00</CDN1>
                    <CDN2>00:00:10.00</CDN2>
                    <CDN3>BOO_EDDE_ASDF</CDN3>
                    <CDN4>3</CDN4>
                </CD>
                <CD ID="3">
                    <CDN1>10:00:30.00</CDN1>
                    <CDN2>00:00:10.00</CDN2>
                    <CDN3>BOO_EDDF_ASDF</CDN3>
                    <CDN4>3</CDN4>
                </CD>
                <CD ID="4">
                    <CDN1>10:00:40.00</CDN1>
                    <CDN2>00:00:10.00</CDN2>
                    <CDN3>BOO_EDDG_ASDF</CDN3>
                    <CDN4>3</CDN4>
                </CD>
                <CD ID="5">
                    <CDN1>10:00:50.00</CDN1>
                    <CDN2>00:00:10.00</CDN2>
                    <CDN3>BOO_EDDH_ASDF</CDN3>
                    <CDN4>3</CDN4>
                </CD>
        </Event>
        <Event id="4">
            <NumberPR>00:00:00.00</NumberPR>
            <InfoZ>BB123457</InfoZ>
            <TITLE>Book</TITLE>
            <NumberS>00:00:00.00</NumberS>
            <NumberT>00:10:00.00</NumberT>
            <AddInfo>
                <AS1>D</AS1>
                <AS2>03FF</AS2>
                <AS3>1</AS3>
            </AddInfo>
            <Video>1</Video>
            <AddExtra>
                <AE1>1</AE1>
                <AE2>x</AE2>
                <AE3>0</AE3>
                <AE4>1</AE4>
                <AE5>0</AE5>
            </AddExtra>
            <Copies>30</Copies>
            <CodeZ>2A3B4E8C</CodeZ>
            <Band>1</Band>
            <NumberOfCD>0</NumberOfCD>
        </Event>
    </Main>
    <Alternative>
        <AlternativeList id="1">
            <Event id="1">
                <NumberPR>00:00:00.00</NumberPR>
                <InfoZ>MB123456</InfoZ>
                <TITLE>Magazine</TITLE>
                <NumberS>00:00:00.00</NumberS>
                <NumberT>00:10:00.00</NumberT>
                <AddInfo>
                    <AS1>D</AS1>
                    <AS2>03FF</AS2>
                    <AS3>1</AS3>
                </AddInfo>
                <Video>1</Video>
                <AddExtra>
                    <AE1>1</AE1>
                    <AE2>x</AE2>
                    <AE3>0</AE3>
                    <AE4>1</AE4>
                    <AE5>0</AE5>
                </AddExtra>
                <Copies>30</Copies>
                <CodeZ>2A3B4E8C</CodeZ>
                <Band>1</Band>
                <NumberOfCD>0</NumberOfCD>
                    
            </Event>
            <Event id="2">
                <NumberPR>00:00:00.00</NumberPR>
                <InfoZ>NB123456</InfoZ>
                <TITLE>Magazine C</TITLE>
                <NumberS>00:00:00.00</NumberS>
                <NumberT>00:10:00.00</NumberT>
                <AddInfo>
                    <AS1>D</AS1>
                    <AS2>03FF</AS2>
                    <AS3>1</AS3>
                </AddInfo>
                <Video>1</Video>
                <AddExtra>
                    <AE1>1</AE1>
                    <AE2>x</AE2>
                    <AE3>0</AE3>
                    <AE4>1</AE4>
                    <AE5>0</AE5>
                </AddExtra>
                <Copies>30</Copies>
                <CodeZ>2A3B4E8C</CodeZ>
                <Band>1</Band>
                <NumberOfCD>1</NumberOfCD>
                    <CD ID="1">
                        <CDN1>10:00:00.00</CDN1>
                        <CDN2>00:00:10.00</CDN2>
                        <CDN3>MAG_ESDRE_32322</CDN3>
                        <CDN4>3</CDN4>
                    </CD>
            </Event>
        </AlternativeList>
        <AlternativeList id="2">
            <Event id="1">
                <NumberPR>00:00:00.00</NumberPR>
                <InfoZ>MB123456</InfoZ>
                <TITLE>Magazine K</TITLE>
                <NumberS>00:00:00.00</NumberS>
                <NumberT>00:10:00.00</NumberT>
                <AddInfo>
                    <AS1>D</AS1>
                    <AS2>03FF</AS2>
                    <AS3>1</AS3>
                </AddInfo>
                <Video>1</Video>
                <AddExtra>
                    <AE1>1</AE1>
                    <AE2>x</AE2>
                    <AE3>0</AE3>
                    <AE4>1</AE4>
                    <AE5>0</AE5>
                </AddExtra>
                <Copies>30</Copies>
                <CodeZ>2A3B4E8C</CodeZ>
                <Band>1</Band>
                <NumberOfCD>1</NumberOfCD>
                    <CD ID="1">
                        <CDN1>10:00:00.00</CDN1>
                        <CDN2>00:00:10.00</CDN2>
                        <CDN3>MAG_XCVFG_32346</CDN3>
                        <CDN4>3</CDN4>
                    </CD>
            </Event>
        </AlternativeList>
    <AlternativeList id="3">
            <Event id="1">
                <NumberPR>00:00:00.00</NumberPR>
                <InfoZ>MB123456</InfoZ>
                <TITLE>Magazine P</TITLE>
                <NumberS>00:00:00.00</NumberS>
                <NumberT>00:10:00.00</NumberT>
                <AddInfo>
                    <AS1>D</AS1>
                    <AS2>03FF</AS2>
                    <AS3>1</AS3>
                </AddInfo>
                <Video>1</Video>
                <AddExtra>
                    <AE1>1</AE1>
                    <AE2>x</AE2>
                    <AE3>0</AE3>
                    <AE4>1</AE4>
                    <AE5>0</AE5>
                </AddExtra>
                <Copies>30</Copies>
                <CodeZ>2A3B4E8C</CodeZ>
                <Band>1</Band>
                <NumberOfCD>1</NumberOfCD>
                    <CD ID="1">
                        <CDN1>10:00:00.00</CDN1>
                        <CDN2>00:00:10.00</CDN2>
                        <CDN3>MAG_XCVFG_32349</CDN3>
                        <CDN4>3</CDN4>
                    </CD>
            </Event>
        </AlternativeList>
    </Alternative>
</AllList>

 

lm06.xml

Share this post


Link to post
Share on other sites

Here a simple way to extract some of the tags :

#include <Constants.au3>
#include <Array.au3>

Local Const $TAGS[] = ["<Event id=", "<NumberPR>", "<InfoZ>", "<TITLE>", "<NumberT>", "<AS1>"]

Local $sPattern = _ArrayToString($TAGS)
Local $aTag1D = StringRegExp(FileRead("Test.xml"), "(" & $sPattern & ")([^<>]*)", 3)

Local $aTag2D = _Array_Resize($aTag1D, 2)
_ArrayDisplay($aTag2D)

Func _Array_Resize(ByRef $aArray1d, $iColumns, $iStart = Default)
  If IsKeyword($iStart) Then $iStart = 0
  Local $iElements = UBound($aArray1d) - $iStart
  If Mod($iElements, $iColumns) <> 0 Then Return SetError(1, 0, False)
  Local $aArray2d[$iElements / $iColumns][$iColumns]
  For $i = 0 To $iElements - 1
    $aArray2d[Floor($i / $iColumns)][Mod($i, $iColumns)] = $aArray1d[$i + $iStart]
  Next
  Return $aArray2d
EndFunc   ;==>_Array_Resize

Once you got the 2D array, you can reformat at will.

Edited by Nine
Streamlined the code

Share this post


Link to post
Share on other sites

Here's an example that processes the XML file using the XML UDF.  This is not meant to be complete a solution.  It is merely an example framework that you can learn from and build upon.  I tried to document it well enough for you to get a general idea of what each block of code is doing.  I also tried to give you an example of how you can process the different types of value structures that are in your XML file (single value, static number of sub values, dynamic number of sub values).  As you said is preferable, the logic handles a variable number of CD entries from 0 to how ever many there are.  It does so by creating an array of CD entries and placing that array as one of the array columns in the MainEvents array row.

 

#include <Constants.au3>
#include <Array.au3>
#include <xml.au3>

example()

Func example()
    Const $XML_FILE  = "lm06.xml" ;<-- Point to your xml file

    Local $oXmlDoc, $oNodes, $oNode
    Local $iCDCount

    Enum  $MAIN_EVENTID, $MAIN_INFOZ, $MAIN_TITLE, $MAIN_AS1, $MAIN_AS2, $MAIN_AS3, $MAIN_CDARRAY, $MAIN_FLD_COUNT
    Local $aMainEvents[0][$MAIN_FLD_COUNT]

    Enum  $CD_ID, $CD_CDN1, $CD_CDN2, $CD_CDN3, $CD_CDN4, $CD_FLD_COUNT
    Local $aCDs[0][$CD_FLD_COUNT]


    ;Create XML document object & load xml file
    $oXmlDoc = _XML_CreateDOMDocument()
    _XML_Load($oXmlDoc, $XML_FILE)
    If @error Then Exit MsgBox($MB_ICONERROR + $MB_TOPMOST, "ERROR", "_XML_Load failed - @error = " & @error)

    ;Select //Main/Event nodes
    $oNodes = _XML_SelectNodes($oXmlDoc, '//Main/Event')
    If @error Then Exit MsgBox($MB_ICONERROR + $MB_TOPMOST, "ERROR", "Error selecting //Main/Event nodes - @error = " & @error)

    ;Process //Main/Event nodes
    For $i = 0 To $oNodes.Length - 1
        ;Add and populate an array row
        _ArrayAdd($aMainEvents, "")

        $oNode                          = $oNodes.Item($i)
        $aMainEvents[$i][$MAIN_EVENTID] = _XML_GetValue($oNode, '@id')[1]
        $aMainEvents[$i][$MAIN_INFOZ]   = _XML_GetValue($oNode, 'InfoZ')[1]
        $aMainEvents[$i][$MAIN_TITLE]   = _XML_GetValue($oNode, 'TITLE')[1]
        $aMainEvents[$i][$MAIN_AS1]     = _XML_GetValue($oNode, 'AddInfo/AS1')[1]
        $aMainEvents[$i][$MAIN_AS2]     = _XML_GetValue($oNode, 'AddInfo/AS2')[1]
        $aMainEvents[$i][$MAIN_AS3]     = _XML_GetValue($oNode, 'AddInfo/AS3')[1]

        ;Create a dynamic array of CD entries and add the array to the main array row
        $iCDCount = _XML_GetValue($oNode, 'NumberOfCD')[1]
        ReDim $aCDs[0][$CD_FLD_COUNT]
        For $j = 0 To $iCDCount - 1
            ;Add and populate a CD array row
            _ArrayAdd($aCDs, "")
            $aCDs[$j][$CD_ID]   = _XML_GetValue($oNode, 'CD[' & $j + 1 & ']/@ID')[1]
            $aCDs[$j][$CD_CDN1] = _XML_GetValue($oNode, 'CD[' & $j + 1 & ']/CDN1')[1]
            $aCDs[$j][$CD_CDN2] = _XML_GetValue($oNode, 'CD[' & $j + 1 & ']/CDN2')[1]
            $aCDs[$j][$CD_CDN3] = _XML_GetValue($oNode, 'CD[' & $j + 1 & ']/CDN3')[1]
            $aCDs[$j][$CD_CDN4] = _XML_GetValue($oNode, 'CD[' & $j + 1 & ']/CDN4')[1]
        Next
        $aMainEvents[$i][$MAIN_CDARRAY] = $aCDs
    Next

    ;Display Main Events array
    _ArrayDisplay($aMainEvents, "Main Events", "", 0, Default, _
                  "ID|InfoZ|Title|AS1|AS2|AS3|CDARRAY")

    ;Display CD array of first Main Event row (as an example)
    _ArrayDisplay($aMainEvents[0][$MAIN_CDARRAY], "Main Events[0] CD Array", "", 0, Default, _
                  "ID|CDN1|CDN2|CDN3|CDN4")

    ;Display CD array of last Main Event row (there are none - empty array)
    _ArrayDisplay($aMainEvents[3][$MAIN_CDARRAY], "Main Events[3] CD Array", "", 0, Default, _
                  "ID|CDN1|CDN2|CDN3|CDN4")
EndFunc

 

Array Displays Using Your XML File:

image.png.f5175cc0d974390b6f5a13bb78b648f0.png

image.png.3c8dedcd9101a4c5872dc5fc13a62712.png

image.png.8c34ffb2625606f073b47a6d4de8de98.png

Edited by TheXman
Standardized array logic

Share this post


Link to post
Share on other sites

Thank you very much! Thanks to @Nine I have a quick solution to my problem, and thanks to @TheXman - I have a lot of work and study to get a more universal solution for the future. I couldn't imagine a better help, thank you.!

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

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...