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.