venerdì 9 maggio 2014

Classe derivata di paziente per mezzo di ereditarietà tramite prototipo

Creazione di una classe derivata di "paziente" per mezzo dell'ereditarietà tramite prototipo.
function prestazione(data,diagnosi){
 this.data=data;
 this.diagnosi=diagnosi;
}

function paziente(){
 this.prestazioni=new Array;
 this.aggiungiPrestazione = function(data,diagnosi){
  var prest=new prestazione(data,diagnosi);
  this.prestazioni.push(prest);
 }
}

function paziente1(){
 this.problemi=new Array;
 this.aggiungiProblema = function(problema){
  this.problemi.push(problema);
 }
}
paziente1.prototype=new paziente();

var Paziente=new paziente1();
Paziente.aggiungiProblema("diabete");
Paziente.aggiungiPrestazione("14/2/2013","ipertensione");
Paziente.aggiungiPrestazione("10/3/2013","colica renale");
for(var i=0;i<Paziente.prestazioni.length;i++)
 alert(Paziente.prestazioni[i].data+" "+Paziente.prestazioni[i].diagnosi);
for(var i=0;i<Paziente.problemi.length;i++)
 alert(Paziente.problemi[i]);
Con questa ho aggiunto anche i problemi in anamnesi.

Un oggetto di tipo "paziente" per l'archiviazione delle pregresse prestazioni.

Un codice scritto di getto senza neanche un errore...

Ecco il mio modello per elencare le prestazioni di un paziente.
function prestazione(data,diagnosi){
 this.data=data;
 this.diagnosi=diagnosi;
}

function paziente(){
 this.prestazioni=new Array;
 this.aggiungiPrestazione = function(data,diagnosi){
  var prest=new prestazione(data,diagnosi);
  this.prestazioni.push(prest);
 }
}

var Paziente=new paziente();
Paziente.aggiungiPrestazione("14/2/2013","ipertensione");
Paziente.aggiungiPrestazione("10/3/2013","colica renale");
for(var i=0;i<Paziente.prestazioni.length;i++)
 alert(Paziente.prestazioni[i].data+" "+Paziente.prestazioni[i].diagnosi);

giovedì 8 maggio 2014

Artifizio per salvare un file XML (da un mio vecchio studio).

Ecco come salvare un file XML modificato: ho trovato il link nel mio diario "grezzo". Questo è il codice:
   var fso=new ActiveXObject("Scripting.FileSystemObject");
   var path=document.location.pathname;
   path=path.substr(1,path.lastIndexOf("/"));
   path=path.replace(/%20/g," ");
   var f=fso.CreateTextFile(path+"data.xml",true);
   f.write(xmlDoc.xml);
   f.Close();
   fso=null;
Rianalizziamolo...

Ecco: creazione di un ActiveXObject FileSystemObject. Quindi creazione di un file di testo:
function funzione(){
 var fso=new ActiveXObject("Scripting.FileSystemObject");
 var f=fso.CreateTextFile("Ciao.txt",true);
}
funzione();
Questo è sufficiente a crearmi nella stessa locazione del file in cui viene eseguito il codice un file "Ciao.txt".

Il problema del path

Vediamo il path.
function funzione(){
 var path=document.location.pathname;
 document.write(path);
}
funzione();
Output:
/C:/Users/Antonello/Desktop/js.html

Nel codice che avevo creato in passato c'era anche una riga che ritagliava il path, ottenendo l'eliminazione del primo slash e del nome del file:
function funzione(){
 var path=document.location.pathname;
 path=path.substr(1,path.lastIndexOf("/"));
 document.write(path);
}
funzione();
Output:
C:/Users/Antonello/Desktop/

E anche una riga un po' "misteriosa"...:
path=path.replace(/%20/g," ");
Ecco, ho ripassato il metodo replace e ho decifrato che questa riga l'avevo messa per sostituire globalmente (g) tutti i simboli %20 (codice ASCII per spazio) con uno spazio reale.
Il problema si pone quando una cartella del path ha degli spazi vuoti nel nome.
Pongo il file in una cartella con spazi vuoti ed ecco cosa ottengo prima di inserire questa riga. Il codice è ancora lo stesso, ma il file è salvato in una cartella chiamata "Cartella con gli spazi".
function funzione(){
 var path=document.location.pathname;
 path=path.substr(1,path.lastIndexOf("/"));
 document.write(path);
}
funzione();
Output:
C:/Users/Antonello/Desktop/Cartella%20con%20gli%20spazi/

Ecco con l'aggiunta di quella riga:
function funzione(){
 var path=document.location.pathname;
 path=path.substr(1,path.lastIndexOf("/"));
 path=path.replace(/%20/g," ");
 document.write(path);
}
funzione();
Output:
C:/Users/Antonello/Desktop/Cartella con gli spazi/

Unendo questa stringa al nome del file da salvare, ottengo il path completo!

Alcuni metodi dell'oggetto XmlDoc

childNodes:

var mioXml = new ActiveXObject("Microsoft.XMLDOM");
mioXml.async=false;
mioXml.load("doc.xml");
var radice=mioXml.documentElement;
var figli=radice.childNodes;
document.write(figli[0].text);
Ciao, ciccio.


firstChild:

var mioXml = new ActiveXObject("Microsoft.XMLDOM");
mioXml.async=false;
mioXml.load("doc.xml");
var radice=mioXml.documentElement;
var primoFiglio=radice.firstChild;
document.write(primoFiglio.text);

hasChildNodes:

var mioXml = new ActiveXObject("Microsoft.XMLDOM");
mioXml.async=false;
mioXml.load("doc.xml");
var radice=mioXml.documentElement;
document.write(radice.hasChildNodes);
true


Iniziamo XMLDOM

Apriamo un semplice file XML con XMLDOM.

Usiamo IE.

Buttiamo giù il codice JavaScript.
var mioXml = new ActiveXObject("Microsoft.XMLDOM");
mioXml.async=false;
Non mi importa di dire fesserie, vado per ipotesi a valanga, suscettibili di correzioni e integrazioni successive:
Adesso carico il file:
var mioXml = new ActiveXObject("Microsoft.XMLDOM");
mioXml.async=false;
mioXml.load("doc.xml");
Adesso mi posiziono sulla radice del documento:
var mioXml = new ActiveXObject("Microsoft.XMLDOM");
mioXml.async=false;
mioXml.load("doc.xml");
var radice=mioXml.documentElement;
E adesso che mi sono posizionato, che faccio?

Provo a mettere in opera alcune istruzioni per manipolare il file XML:
nodeName che restituirebbe il nome del nodo.
Essendo posizionato sulla radice, mi dovrebbe restituire il nome del tag radice.
var mioXml = new ActiveXObject("Microsoft.XMLDOM");
mioXml.async=false;
mioXml.load("doc.xml");
var radice=mioXml.documentElement;
var nome=radice.nodeName;
alert(nome);
Ottengo messaggi di errore, finché scopro il motivo: il documento non è valido perché è così formato:
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE capitolo [
<!ELEMENT capitolo (paragrafo?)>
<!ELEMENT paragrafo (#PCDATA)>
]>
<capitolo>
 <paragrafo>
  Ciao, ciccio.
 </paragrafo>
 <paragrafo>
 </paragrafo>
</capitolo> 
Provando con il mitico validatore svelo l'arcano: nel DTD c'è un punto interrogativo che esprime un numero di occorrenze del tag paragrafo da 0 a 1 volta, e invece esso è rappresentato due volte!
Correggo, e ottengo il risultato giusto: una casella di avviso con scritto
capitolo


Adesso esploro tutti i metodi che mi permettono di manipolare il documento XML in Internet Explorer...

mercoledì 7 maggio 2014

Simboli relativi alle occorrenze di un tag

Ora vediamo di capire i simboli che significano il numero di occorrenze di un tag.
Scrivo un + che dovrebbe significare una o più volte, e provo:

Con zero occorrenze del tag:
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE capitolo [
<!ELEMENT capitolo (paragrafo+)>
<!ELEMENT paragrafo (#PCDATA)>
]>
<capitolo>
</capitolo> 
Non valido


Con una occorrenza del tag:
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE capitolo [
<!ELEMENT capitolo (paragrafo+)>
<!ELEMENT paragrafo (#PCDATA)>
]>
<capitolo>
   <paragrafo>
   </paragrafo>
</capitolo> 
Valido!


con più occorrenze del tag:
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE capitolo [
<!ELEMENT capitolo (paragrafo+)>
<!ELEMENT paragrafo (#PCDATA)>
]>
<capitolo>
   <paragrafo>
   </paragrafo>
   <paragrafo>
   </paragrafo>
</capitolo> 
Valido!

Adesso con *, che dovrebbe significare "zero o più volte".

Zero occorrenze:
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE capitolo [
<!ELEMENT capitolo (paragrafo*)>
<!ELEMENT paragrafo (#PCDATA)>
]>
<capitolo>
</capitolo> 
Valido!


Una occorrenza:
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE capitolo [
<!ELEMENT capitolo (paragrafo*)>
<!ELEMENT paragrafo (#PCDATA)>
]>
<capitolo>
   <paragrafo>
   </paragrafo>
</capitolo> 
Valido!


Con più occorrenze:
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE capitolo [
<!ELEMENT capitolo (paragrafo*)>
<!ELEMENT paragrafo (#PCDATA)>
]>
<capitolo>
   <paragrafo>
   </paragrafo>
   <paragrafo>
   </paragrafo>
</capitolo> 
Valido!

Adesso metto il segno ? che dovrebbe significare zero o una occorrenza, e provo:

Zero occorrenze:
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE capitolo [
<!ELEMENT capitolo (paragrafo?)>
<!ELEMENT paragrafo (#PCDATA)>
]>
<capitolo>
</capitolo> 
Valido!


Una occorrenza:
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE capitolo [
<!ELEMENT capitolo (paragrafo?)>
<!ELEMENT paragrafo (#PCDATA)>
]>
<capitolo>
 <paragrafo>
 </paragrafo>
</capitolo> 
Valido!


Più occorrenze:
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE capitolo [
<!ELEMENT capitolo (paragrafo?)>
<!ELEMENT paragrafo (#PCDATA)>
]>
<capitolo>
 <paragrafo>
 </paragrafo>
 <paragrafo>
 </paragrafo>
</capitolo> 
Non valido

Riassumendo:
+ va da 1 a molte;
* va da 0 a molte;
? va da 0 a una.

Ancora DTD: definizione di diversi tags.

Ecco un tag capitolo che contiene un tag paragrafo, validato dal validatore:
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE capitolo [
<!ELEMENT capitolo (paragrafo+)>
<!ELEMENT paragrafo (#PCDATA)>
]>
<capitolo>
 <paragrafo>
 </paragrafo>
</capitolo> 
Ho definito paragrafo come #PCDATA senza sapere minimamente cosa significasse.
Andiamo a vederlo:

Ah, ecco: dovrebbe significare che contiene testo. E va bene pure questa!