From XML to array

mazza paolo mazzapaolo at libero.it
Wed Feb 24 08:44:33 EST 2010


I need to import the data of an XML file to an ARRAY having the nodes as keys.

For example:  I need to transform an XML file like this ...

<?xml version="1.0"?>
<records>
	<record IDnum="1">
		<firstName>Steve</firstName>
		<lastName>Jobs</lastName>
		<roomNums>
<roomNum1>001</roomNum1>
<roomNum2>054</roomNum2>
<roomNum3>545</roomNum1>
</roomNums>
		<phoneExt>345</phoneExt>
		<parkingSlot>100</parkingSlot>
	</employee>
	<record IDnum="2">
		<firstName>Bill</firstName>
		<lastName>Gates</lastName>
		<roomNums>
<roomNum1>454</roomNum1>
<roomNum2>656</roomNum2>
</roomNums>
		<phoneExt>666</phoneExt>
		<parkingSlot>987</parkingSlot>
	</employee>
	<record IDnum="3">
		<firstName>Linus</firstName>
		<lastName>Torvald</lastName>
	<roomNums>
<roomNum1>001</roomNum1>
<roomNum2>054</roomNum2>
<roomNum3>545</roomNum3>
<roomNum4>545</roomNum4>
</roomNums>
		<phoneExt>479</phoneExt>
		<parkingSlot>123</parkingSlot>
	</employee>
	<record IDnum="4">
		<firstName>Kevin</firstName>
		<lastName>Miller</lastName>
		<roomNum>100</roomNum>
		<phoneExt>421</phoneExt>
		<parkingSlot>987</parkingSlot>
	</employee>
</records>

to  an array like this (se the combined version of the array)

/records/record[1]record:
/records/record[1]record/firstName:Steve
/records/record[1]record/lastName:Jobs
/records/record[1]record/parkingSlot:100
/records/record[1]record/phoneExt:345
/records/record[1]record/roomNums:
/records/record[1]record/roomNums/roomNum1:001
/records/record[1]record/roomNums/roomNum2:054
/records/record[1]record/roomNums/roomNum3:545
/records/record[2]record:
/records/record[2]record/firstName:Bill
/records/record[2]record/lastName:Gates
/records/record[2]record/parkingSlot:987
/records/record[2]record/phoneExt:666
/records/record[2]record/roomNums:
/records/record[2]record/roomNums/roomNum1:454
/records/record[2]record/roomNums/roomNum2:656
/records/record[3]record:
/records/record[3]record/firstName:Linus
/records/record[3]record/lastName:Torvald
/records/record[3]record/parkingSlot:123
/records/record[3]record/phoneExt:479
/records/record[3]record/roomNums:
/records/record[3]record/roomNums/roomNum1:001
/records/record[3]record/roomNums/roomNum2:054
/records/record[3]record/roomNums/roomNum3:545
/records/record[3]record/roomNums/roomNum4:545
/records/record[4]record:
/records/record[4]record/firstName:Kevin
/records/record[4]record/lastName:Miller
/records/record[4]record/parkingSlot:987
/records/record[4]record/phoneExt:421
/records/record[4]record/roomNum:100


The following RevTalk  script does the job. I wonder if there is an easyer (and more efficient) way to accomplish this task with Revolution.

local STRUTTURA,NODO1,LISTAARRAY, tDocID

on mouseUp
   local J, tNUMERORECORDS, tParentNode
      put field "DocID" into tDocID
   --the number of records
   put revXMLRootNode(tDocID) into tParentNode
   put revXMLNumberOfChildren(tDocID,tParentNode,"record",0) into tNUMERORECORDS
   
   repeat with J=1 to tNUMERORECORDS
   put "/records/record[" & J & "]" into NODO1
   CreaListaValori
   combine LISTAARRAY with return and  ":"
   put LISTAARRAY & return after message
   end repeat
end mouseUp

on CreaListaValori
   local NOMECAMPO, tNUMERO, VALORECAMPO, LISTA

   put revXMLTree(tDocID, NODO1, cr, tab, false, -1) into STRUTTURA
    repeat with tNUMERO=1 to the number of lines of STRUTTURA
      put line tNUMERO of STRUTTURA into NOMECAMPO
      put CompletaCampo(NOMECAMPO,tNUMERO) into NOMECAMPO
      put revXMLNodeContents(tDocID,NOMECAMPO) into VALORECAMPO
      PUT VALORECAMPO into LISTAARRAY[NOMECAMPO]
   end repeat

end CreaListaValori


function CompletaCampo  NOMECAMPO tNUMERO
   local NUMEROX, LINEA
   set itemdelimiter to TAB
   put the number of items of NOMECAMPO into NUMEROX
   repeat with k=1 to NUMEROX
      if item K of LINEA is empty then
         put CercaNomeCampo(tNUMERO, k ) into item K of LINEA
      end if
   end repeat
   replace tab with "/" in LINEA
   put NODO1 & LINEA into LINEA
   return LINEA
end CompletaCampo

function CercaNomeCampo tNUMERO tPosizione
   local NUMEROX, LINEA, K, NOME
   set itemdelimiter to tab
   repeat with K=tNumero down to 1
      put item tPosizione of line K of STRUTTURA into NOME
      if NOME is not empty then
        return NOME
         exit repeat
      end if
   end repeat
end CercaNomeCampo



Thanks a lot,  Paolo Mazza




More information about the Use-livecode mailing list