Visualizzazione post con etichetta XMLDOM. Mostra tutti i post
Visualizzazione post con etichetta XMLDOM. Mostra tutti i post

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...