Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [AS1] dati xml in array associativo

    Buona sera a tutti
    ho un file xml generato da php in dinamico.
    Riesco ad importare i dati senza alcun problema, però non riesco ad inserirli per come mi servirebbero in un array associativo.
    In pratica se ad esempio il file xml fosse:
    Codice PHP:
    <?xml version="1.0" encoding="ISO-8859-1" ?> 
      <db>
       <dati>
         <record>
           <id>1</id> 
           <struttura>ddd#dddd#ddd#ddd</struttura> 
           <approvato>1</approvato> 
           <livello>3</livello> 
         </record>
         <record>
           <id>2</id> 
           <struttura>1##1##1</struttura> 
           <approvato>1</approvato> 
           <livello>2</livello> 
         </record>
      </dati>
    </db>
    a me servirebbe un array di questo tipo
    array[0][id=1][struttura=ddd#dddd#ddd#ddd]ecc ecc
    array[1][id=2][struttura=1##1##1]ecc ecc

    il problema è che non posso sapere a priori quali sono i tag dentro record nel file xml.
    Ho provato in vari modi, ma non riesco a riempire l'array per come mi serve.
    I dati li ricevo correttamente, quindi il problema è solo riuscire a passare gli indici in maniera dinamica (soprattutto facendoli accettare all'array che invece mi torna sempre vuoto)
    ecco il codice usato nel quale tralascio la parte relativa al caricamento dei dati che ripeto funziona.
    Il codice è in as1 su swishmax.
    Codice PHP:
    this.myxml.gestionedati=function(){
      
    this.fields=this.firstChild.childNodes[0];
      
    y=0;
      for (var 
    field:XMLNode this.fields.firstChildfield != null;field=field.nextSibling){
        
    valori=field.childNodes;
        for (
    x=0;x<valori.length;x++){
           
    this.data[y][valori[x].nodeName]=valori[x].firstChild.nodeValue;
        }
        
    trace (this.data[y]['struttura']);//restituisce undefined
        
    delete valori;
        
    y++;
      }
    }; 
    Grazie

  2. #2
    Utente di HTML.it L'avatar di negatyve
    Registrato dal
    Feb 2001
    Messaggi
    9,479
    codice:
    var FINAL_ARRAY = new Array();
    
    var _xml = new XML();
    _xml.ignoreWhite = true;
    _xml.onLoad = function( success:Boolean )
    {
    	if ( success ){
    		var nodes = this.firstChild.firstChild.childNodes;
    		var i, j, node, item, temp;
    		
    		for( i = 0; i < nodes.length; i++ )
    		{
    			node = nodes[ i ];
    			item = new Object();
    			for( j = 0; j < node.childNodes.length; j++ )
    			{
    				temp = node.childNodes[ j ];
    				item[ temp.nodeName ] = temp.firstChild.nodeValue;
    			}
    			FINAL_ARRAY.push( item );
    		}
    	} else {
    		trace( "error" );
    	}
    }
    _xml.load( "test.xml" );

  3. #3
    Utente di HTML.it L'avatar di and80
    Registrato dal
    Mar 2003
    Messaggi
    15,182
    premessa: penso che il codice AS scritto per flash sia valido anche su swishmax...

    in AS non è possibile scrivere un array in quel modo, l'unica è di accedere direttamente all'array utilizzando un Object che contenga gli elementi, poi al massimo puoi fare un if in cui verifichi l'id e in base a quello tracci gli elementi

    io nel tuo caso farei così

    Codice PHP:
    function useArray(a) {
        for (var 
    0j<a.lengthj++) {
            
    trace("id: "+a[j].id);
            
    trace("struttura: "+a[j].struttura);
            
    trace("approvato: "+a[j].approvato);
            
    trace("livello: "+a[j].livello);
        }
    }

    var 
    myarray = new Array();
    var 
    myxml = new XML();
    myxml.ignoreWhite true;
    myxml.onLoad = function(success) {
        if (
    this.loaded) {
            var 
    temp this.firstChild.firstChild.childNodes;
            for (var 
    0i<temp.lengthi++) {
                
    myarray.push({id:temp[i].childNodes[0].firstChild.toString(), struttura:temp[i].childNodes[1].firstChild.toString(), approvato:temp[i].childNodes[2].firstChild.toString(), livello:temp[i].childNodes[3].firstChild.toString()});
            }
            
    useArray(myarray);
        } else {
            
    trace("Fault to load file_ext.xml");
        }
    };
    myxml.load("file_ext.xml"); 
    in pratica nella funzione useArray fai tutto quello che vuoi con il tuo array richiamandolo come parametro della funzione stessa
    il parsing esegue un push di un oggetto che contiene le proprietà corrispondenti ai nodi di ogni "record"
    se devi fare come volevi, dovresti fare così
    Codice PHP:
    if(a[j].id == 1){
    trace(a[j].struttura); // output: ddd#dddd#ddd#ddd

    edit: ciao nega

  4. #4
    Utente di HTML.it L'avatar di negatyve
    Registrato dal
    Feb 2001
    Messaggi
    9,479
    Originariamente inviato da and80
    edit: ciao nega

  5. #5
    intanto ringrazio entrambi per aver risposto, ed anticipo che con il codice di negatyve ho risolto.
    vediamo un po il resto
    premessa: penso che il codice AS scritto per flash sia valido anche su swishmax...
    si, direi che funziona tutto o quasi, basta che sia as1. La mancanza di class è pesante da digerire, ed il trace è di fatto inutilizzabile (ma per quello me ne sono fatto uno da me con una funzione globale e con la versione 2 attualmente in beta il problema è stato risolto).
    in AS non è possibile scrivere un array in quel modo, l'unica è di accedere direttamente all'array utilizzando un Object che contenga gli elementi, poi al massimo puoi fare un if in cui verifichi l'id e in base a quello tracci gli elementi
    Ho visto il tuo codice, che però nel caso specifico non va bene.
    So come si scrivono gli array associativi, ma il mio problema è appunto non sapere quali saranno i tag xml dentro record, perchè generati in automatico da php.
    Ho usato array associativi per altri metodi senza problemi, ma in questo caso non riuscivo a venirne a capo.
    Ho risolto grazie al codice postato da negatyve, e più precisamente con questa parte del codice:
    Codice PHP:
    for( 0nodes.lengthi++ )
            {
                
    node nodes];
                
    item = new Object();
                for( 
    0node.childNodes.lengthj++ )
                {
                    
    temp node.childNodes];
                    
    itemtemp.nodeName ] = temp.firstChild.nodeValue;
                }
                
    FINAL_ARRAY.pushitem );
            } 
    Sinceramente non pensavo si potesse fare questo passaggio per riempire un array (mediante l'uso di un altro array) per ottenere un array associativo, e per questo avevo provato ad accedere direttamente ai valori in quel modo.
    Ringrazio nuovamente entrambi per l'interessamento. Adesso tutto funziona perfettamente.
    Ciao ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.