Procediamo per ordine.
Bisogna innanzitutto vedere quali sono i primi nodi di un documento.
Prendiamo il mio documento xml piuttosto semplice e vediamo quali sono i primi nodi.
La prima proprietà di un oggetto che rappresenta un record del mio database dovrebbe essere il tag che rappresenta.
Cerco di creare una proprietà dell'oggetto che abbia lo stesso nome del tag che rappresenta.
Come fare?
La proprietà la chiamo
tipo in quanto il suo nome è rappresentativo del tipo di informazione contenuto nel record. Dato che la mia tabella è fatta di persone, il tag si chiama <persona>.
Ecco il codice:
function record(){
this.tipo=root.childNodes[0]
}
In pratica assegno alla proprietà
tipo il primo elemento figlio del documento.
Questo approccio
non è corretto. Infatti se poi vado a usare istanze dell'oggetto che rappresentano records diversi dal primo, le loro proprietà
tipo non dovranno rappresentare il primo nodo figlio del documento, ma quelli successivi.
Il ragionamento che posso fare è questo:
- individuare il nome dei primi nodi figli del documento.
- assegnare alla proprietà tipo del record il nodo figlio con quel nome identificato da un numero.
function record(num){
var nomeNodo=root.childNodes[0].nodeName;
this.tipo=root.getElementsByTagName(nomeNodo)[num];
}
La prima riga prende il nome del primo nodo figlio del documento.
La seconda riga assegna alla proprietà
tipo dell'oggetto il nodo figlio identificato dal numero
num, presente come parametro.
Ma ora voglio di più.
Voglio che il nome della proprietà sia uguale al nome del primo nodo figlio che viene trovato.
Ci provo:
function record(num){
var nomeNodo=root.childNodes[0].nodeName;
this[nomeNodo]=root.getElementsByTagName(nomeNodo)[num];
}
e poi istanzio l'oggetto chiedendo di mostrarmi il nome del nodo della proprietà
persona dell'oggetto.
function init(){
Record=new record(0);
alert(Record.persona.nodeName);
}
Dunque la proprietà
persona dell'oggetto richiama immediatamente l'omonimo tag di ogni record della tabella.
Sembra che stia procedendo bene, almeno questo è quanto sono riuscito a fare finora.
Ora andiamo avanti con altre proprietà...
Ecco, sembra che sia riuscito a ottenere un codice con un minimo di funzionalità:
function record(num){
var nomeNodo=root.childNodes[0].nodeName;
this[nomeNodo]=root.getElementsByTagName(nomeNodo)[num];
var nodo=this[nomeNodo];
for(var i=0;i<nodo.childNodes.length;i++){
nomeNodo=nodo.childNodes[i].nodeName;
this[nomeNodo]=nodo.getElementsByTagName(nomeNodo);
}
}
La prima parte desume il nome dei primi nodi figli nella variabile
nomeNodo, quindi la usa per creare una proprietà con lo stesso nome dei nodi, alla quale assegna il nodo figlio indicato dal numero fornito come parametro nel costruttore dell'oggetto.
Ora, questa proprietà, che ha il valore di un oggetto, viene immagazzinata nella variabile privata
nodo.
Quindi questa proprietà viene usata ripetutamente, per quanti sono i nodi figli, per desumere il nome dei nodi figli e creare le relative proprietà con gli stessi nomi dei nodi figli.
Così, quando istanzio l'oggetto, posso usare direttamente il nome dei nodi come fossero delle semplici proprietà dell'oggetto:
function init(){
Record=new record(0);
alert(Record.nome[0].text);
alert(Record.cognome[0].text);
alert(Record.professione[0].text);
alert(Record.figlio[0].text)
alert(Record.figlio[1].text);
}
Devo mettere lo zero quando le proprietà non sono array, mentre quando lo sono, come nel caso della proprietà "figlio", devo specificare l'indice dell'array.
Provo a usare un risultato più "grafico" in modo da copiarlo e incollarlo qui.
function init(){
Record=new record(0);
document.write(Record.nome[0].text+" "+
Record.cognome[0].text+" "+
Record.professione[0].text+" "+
Record.figlio[0].text+" "+
Record.figlio[1].text);
document.write("<br>");
Record=new record(1);
document.write(Record.nome[0].text+" "+
Record.cognome[0].text+" "+
Record.professione[0].text);
}
Ed ecco il risultato:
Ciccio Rossi rapinatore Giovanni Luigi
Giuseppe Verdi Musicista
Il fatto che il secondo record non abbia i campi "figlio" fa sorgere tutta una serie di interrogativi che vedrò di affrontare successivamente...