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

    loop javascript parsing XML generico

    Salve

    Vorrei capire perché dopo aver effettuato il parsing di un file XML (.. XMLHttpRequest ..), il seguente codice funziona correttamente

    codice:
    for (i=0; i<records; i++)
    {
        xmltxt += xmlData.getElementsByTagName("child")[i].children[0].firstChild.nodeValue + " | ";
        xmltxt += xmlData.getElementsByTagName("child")[i].children[1].firstChild.nodeValue + " | ";
        xmltxt += xmlData.getElementsByTagName("child")[i].children[2].firstChild.nodeValue + " | ";
        xmltxt += xmlData.getElementsByTagName("child")[i].children[3].firstChild.nodeValue + " | ";
        xmltxt += xmlData.getElementsByTagName("child")[i].children[4].firstChild.nodeValue + " | <br><hr>";  
    }


    mentre il seguente no.
    TypeError: xmlData.getElementsByTagName(...)[k].children[j] is undefined
    codice:
    for (k=0; k<records; k++)
    {
    for(j=0; j<campi; j++) {
    Print += xmlData.getElementsByTagName("child")[k].children[j].firstChild.nodeValue + " | ";
    }
    Print += " | <br><hr>";
    }
    l'esigenza nasce dal fatto di no saper a priori il numero di campi.

    Grazie

  2. #2
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,505
    se non esiste ovvio che sia undefined
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  3. #3
    Scusami non ho capito la risposta, o forse mi son spiegato male.

    il codice seguente dovrebbe chiarire.

    codice:
    var records = xmlData.getElementsByTagName("child").length;
    
    var campi = xmlData.getElementsByTagName("child")[0].childElementCount;

    Non so a priori il numero dei campi, ma lo posso ricavare col childElementCount.

    Per sapere i valori dei vari nodi figli vorrei usare i cicli annidati.

    Nel primo codice che ho scritto (quello che funziona) ho un numero variabile di record ma posso avere il valore solo dei primi 5 nodi figli.

    Con il loop for dovrei poter avere il valore di tutti i nodi figli indipendentemente dal loro numero.
    '
    Può essere che mi sfugga qualcosa di banale che non vedo, potresti spigarmi meglio?

    Grazie

  4. #4
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,505
    non conosco la libreria che usi ma a conti fatti

    codice:
    xmlData.getElementsByTagName("child")[0]
    stai già provando ad accedere all'elemento 0 di una collezione (array per intenderci). Se la collezione non ha elementi va in errore.
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  5. #5
    il fatto è che se scrivo
    codice:
    xmltxt += xmlData.getElementsByTagName("child")[0].children[0].firstChild.nodeValue;
    xmltxt += xmlData.getElementsByTagName("child")[0].children[1].firstChild.nodeValue;
    xmltxt += xmlData.getElementsByTagName("child")[0].children[2].firstChild.nodeValue;
    xmltxt += xmlData.getElementsByTagName("child")[0].children[3].firstChild.nodeValue;
    xmltxt += xmlData.getElementsByTagName("child")[0].children[4].firstChild.nodeValue;
    .                              .                                       .                .                 .
    xmltxt += xmlData.getElementsByTagName("child")[1].children[0].firstChild.nodeValue;
    xmltxt += xmlData.getElementsByTagName("child")[1].children[1].firstChild.nodeValue;
    xmltxt += xmlData.getElementsByTagName("child")[1].children[2].firstChild.nodeValue;
    
    .                              .                                       .                .                 .
    .                              .                                       .                .                 .
    .                              .                                       .                .                 .
    
    xmltxt += xmlData.getElementsByTagName("child")[75].children[4].firstChild.nodeValue;
    non ho nessun problema.

    Ma se provo a usare i due cicli for ho il messaggio di errore.

    Uso javascript niente di più.

  6. #6
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,686
    Ciao, premetto che nel codice che hai postato non si capisce se hai volontariamente omesso qualcosa (per riportarlo sul forum) e se questo può influire sull'errore che ti salta fuori.

    Nel primo tuo post, per il ciclo interno hai usato la variabile campi, ma non vedo dove la stai valorizzando.

    Non è chiaro se tutti i child abbiano lo stesso numero di figli o se ognuno (quindi ("child")[k]) possa avere rispettivamente un proprio numero di figli.

    In quest'ultimo caso, la variabile campi andrebbe presumibilmente popolata prima di quel ciclo interno (o nell'intestazione) e, in particolare, per ogni iterazione del ciclo più esterno (e quindi per ogni child).

    In sostanza, ciò che hai indicato nel secondo post:
    codice:
    var campi = xmlData.getElementsByTagName("child")[0].childElementCount;
    andrebbe fatto dentro il primo ciclo, prima di eseguire quello interno (o nella sua intestazione), ma per ("child")[k], non solo per ("child")[0], in modo che la variabile campi sia popolata rispettivamente per ogni child relativo al primo ciclo.

    Se invece si ha certezza che tutti i child abbiano un numero uguale di nodi interni, allora bisogna capire meglio dove vai a popolare quella variabile e accertarsi che il suo valore sia valido per le operazioni che esegui dentro il ciclo interno.



    Inoltre, un consiglio, lo script all'interno dei cicli annidati potrebbe essere ottimizzato. Infatti i metodi di selezione dei nodi eseguono una ricerca all'interno del documento xml, per cui si ha un dispendio di risorse ogni volta che si esegue una qualche selezione (sebbene possa essere minimo) che nel complesso può comunque influire sulla velocità di esecuzione dello script. In tal senso sarebbe più ottimale (a livello sia di esecuzione sia di pulizia/leggibilità del codice) scaglionare le varie parti delle selezioni, utilizzando magari delle variabili di supporto.

    Un esempio può chiarire meglio:
    codice:
    <!DOCTYPE HTML>
    <html lang="it">
       <head>
          <title>Esempio</title>
          <meta charset="utf-8">
       </head>
       <body>
          <script>
             
             var xmlData = new window.DOMParser().parseFromString(
                  '<main>'
                + '   <child>'
                + '      <x>11</x>'
                + '      <x>12</x>'
                + '      <x>13</x>'
                + '   </child>'
                + '   <child>'
                + '      <x>21</x>'
                + '      <x>22</x>'
                + '   </child>'
                + '   <child>'
                + '      <x>31</x>'
                + '      <x>32</x>'
                + '      <x>33</x>'
                + '      <x>34</x>'
                + '   </child>'
                + '</main>'
             , 'text/xml');
    
             var output = '';
             var figli = xmlData.getElementsByTagName('child');
             var records = figli.length;
             
             for (let k=0; k<records; k++){
                for(let j=0, figlio=figli[k], campi=figlio.childElementCount; j<campi; j++){
                   output += figlio.children[j].firstChild.nodeValue + ' | ';
                }
                output += ' | <br><hr>';
             }
    
             document.write(output);
    
          </script>
       </body>
    </html>
    .
    Fai sapere se risolvi o eventualmente chiarisci meglio secondo ciò che ho indicato.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  7. #7
    Grazie per l'aiuto, il problema era altrove.

    Il cicli annidati funzionano il codice lo avevo già ottimizzato, ho scritto in esteso, solo per dare più, info.
    il problema è che ho usato un file per i primi test con campi e records decisi da me,
    poi ho preso un'altro file xml dove mancava un tag di campo in uno dei records.

    Mi ha dato da pensare quando mi hai detto che non era chiaro se tutti i child avevano lo stesso numero di figli. i file xml che devo gestire hanno il vincolo di avere tutti lo stesso numero di figli, avevo mappato un file da excel e non mi ero accorto che a un child mancava un figlio...

    Mea Culpa...

  8. #8
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,505



    dai che capita a tutti



    welcome to the digital world
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  9. #9
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,686
    Quote Originariamente inviata da Krek_Stealth Visualizza il messaggio
    Grazie per l'aiuto, il problema era altrove.
    [...]
    Mea Culpa...
    no problemo

    mi fa piacere comunque che tu abbia risolto
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

Tag per questa discussione

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 © 2024 vBulletin Solutions, Inc. All rights reserved.