Aggiungere nodo XML

mercoledì 07 ottobre 2009 - 14.46

lupin23 Profilo | Newbie

Buongiorno a tutti innanzitutto! Da qualche tempo sto lavorando ad un sito un cui, in un'apposita sezione, gli utenti possono caricare delle foto su suddeto sito tramite form. Le informazioni del form vengono prese ed utilizzate per compilare un file xml. Posto il tutto per chiarezza :

gallery.xml
<gallery title="Photo Album" thumbDir="./images/" imageDir="./images/" random="true">
<category name="Photos">
<image>
<date>03.31.06</date>
<title>View of Seattle</title>
<desc>View of Seattle</desc>
<thumb>seattle5.jpg</thumb>
<img>seattle5.jpg</img>
</image>
<image>
<date>03.31.06</date>
<title>View of Seattle</title>
<desc>View of Seattle</desc>
<thumb>seattle7.jpg</thumb>
<img>seattle7.jpg</img>
</image>
<image>
<date>03.31.06</date>
<title>My Town</title>
<desc>On the way home</desc>
<thumb>seattle10.jpg</thumb>
<img>seattle10.jpg</img>
</image>
</category>
</gallery>

Questo è invece il file ASP che "scrive" nel file XML:

save.asp
<%@LANGUAGE = JScript%>
<%
var oggetto = new ActiveXObject("Microsoft.XMLDOM");
oggetto.async = false;
oggetto.load(Server.MapPath("gallery.xml"));

var root = oggetto.documentElement.appendChild(oggetto.createElement("image"));

var img = root.appendChild(oggetto.createElement("img"));
vfile = Request.Form("file");
img.text = ("images/".concat(vfile));

var thb = root.appendChild(oggetto.createElement("thumb"));
thb.text = ("images/".concat(vfile));

var dsc = root.appendChild(oggetto.createElement("desc"));
dsc.text = Request.Form("text");

var dat = root.appendChild(oggetto.createElement("date"));
dat.text = Request.Form("dat");

var tit = root.appendChild(oggetto.createElement("title"));
tit.text = Request.Form("tit");

oggetto.save(Server.MapPath("gallery.xml"));

Response.Redirect ("notifica.asp")
%>

Bene! Ora il mio problema è il seguente: la pagina save.asp scrive, ma nel punto sbagliato! Mi aggiunge le info prelevate dal form dopo </category>, quando invece dovrebbe porli al suo interno. Ho girato per pagine e pagine in italiano ed in inglese, ma non ho trovato la soluzione!
Aiutatemi per favore!

dante Profilo | Junior Member

Da quello che hai scritto la root è errata

Saluti
Dante

lupin23 Profilo | Newbie

Ciao, Dante, innanzitutto grazie della risposta! Avevo immaginato che sbagliavo qualcosa nella root, ma essendo un autodidatta proprio non riesco ad uscirne...non è che riusciresti a spiegarmi un po' meglio dove sbaglio...mi manca solo questa parte per finire un sito!

dante Profilo | Junior Member

Quando effettui il salvataggio ti trovi in questa situazione suppongo:

[...]
<image>
<date>03.31.06</date>
<title>View of Seattle</title>
<desc>View of Seattle</desc>
<thumb>seattle7.jpg</thumb>
<img>seattle7.jpg</img>
</image>
<image>
<date>03.31.06</date>
<title>My Town</title>
<desc>On the way home</desc>
<thumb>seattle10.jpg</thumb>
<img>seattle10.jpg</img>
</image>
</category>
<images>
<date>nuova data</date>
<title>nuovo titolo</title>
<desc>nuova descr.</desc>
<thumb>immagine thumb</thumb>
<img>immagine</img>
</images>
</gallery>

Se non ho scritto una cavolata il problema è la dichiarazione di root.
Dovrebbe essere così:
var root = oggetto.documentElement.appendChild(oggetto.createElement("image"));

lupin23 Profilo | Newbie

La situazione che hai supposto è giustissima Dante! Ho provato a correggere (effettivamente scritto così ...(oggetto.createElement("images"));... era errato! Mi era scappata una S ) ma ottengo questa situazione:

file xml
<gallery title="Photo Album" thumbDir="./images/" imageDir="./images/" random="true">
<category name="Introducing Seattle">
<image>
<date>03.31.06</date>
<title>View of Seattle</title>
<desc>View of Seattle</desc>
<thumb>seattle5.jpg</thumb>
<img>seattle5.jpg</img>
</image>
<image>
<date>03.31.06</date>
<title>View of Seattle</title>
<desc>View of Seattle</desc>
<thumb>seattle7.jpg</thumb>
<img>seattle7.jpg</img>
</image>
<image>
<date>03.31.06</date>
<title>My Town</title>
<desc>On the way home</desc>
<thumb>seattle10.jpg</thumb>
<img>seattle10.jpg</img>
</image>
</category>
<image>
<date>nuova_data</date>
<title>nuovo_titolo</title>
<desc>nuova_descrizione</desc>
<thumb>nuova_anteprima</thumb>
<img>nuova_foto</img>
</image>
</gallery>

Il blocco di "codice" (non so se sia il termine esatto) compreso tra <image> ed </image> dovrebbe essere all'interno di <category> ed ottenere così questo risultato:

<category>
...le prime tre foto (nn riscrivo tutto il codice)..
</image>
<image>
<date>nuova_data</date>
<title>nuovo_titolo</title>
<desc>nuova_descrizione</desc>
<thumb>nuova_anteprima</thumb>
<img>nuova_foto</img>
</image>
</category>
</gallery>

Non riesco a fargli capire il punto preciso in cui va inserito il nodo (detto papale-papale!). Non è che può c'entrare qualcosa tipo firstChild o insertBefore????
Spero di essermi spiegato nel modo corretto e grazie dell'aiuto!

dante Profilo | Junior Member

no, la root per image è category

Pinky Profilo | Junior Member

>Mi aggiunge le info prelevate dal form dopo </category>, quando invece dovrebbe porli al suo interno.
>var root = oggetto.documentElement.appendChild(

root normalmente è il primo (ed unico) nodo figlio dell'XML (infatti il tuo XML risultante NON è valido).
Nel tuo caso la root è "gallery", ottenuto da oggetto.documentElement.
oggetto.createElement("images")); => crea un elemento di nome "images".
oggetto.documentElement.appendChild(...) => appende(aggiunge in fondo) alla lista di child della root (xml.documentElement) il nodo passato.

Per prima cosa dai dei nomi significativi alle istanze altrimenti è un casino.
Non ho visto la documentazione ma penso appendChild() mi trestituisca l'elemento appena aggiunto, il tuo "images" che invece viene chiamato root.
Ho fatto un pò di fatica a capire il codice anche per questo.
Ti hanno obbligato ad usare solo 3 lettere (dsc = desc = descrizione, dat = data) ?

Detto questo,
e dato per scontato che esiste un solo nodo category (e quindi prendo il primo nodo FIGLIO di root)
e che esista il metodo firstChild(),
credo che un modo corretto per aggiungere un nuovo elemento "images" possa essere il seguente:

var nodoImmagine = xmlDoc.createElement("images"); // oggetto non mi piace come nome xmlDoc.documentElement.firstChild().appendChild(nodoImmagine); // <-- ti basta correggere questo var nodoFile = xmlDoc.createElement("img"); nodoFile.text = ... nodoImmagine.appendChild( nodoFile );

ecc...

Non ho modo di provare il codice ASP e quindi spero di aver scritto una roba corretta.
In pratica ti manca di aggiungere firstChild() o qualcosa di equivalente (Childs[0] o simile).

Ciao
Alessandro

lupin23 Profilo | Newbie

Ho provato con category al posto di image, ma non va!

Ho provato anche col codice postato da Pinky (grazie )ma mi sono perso! Come ho premesso sono un autodidatta e la tua spiegazione è un po' troppo tecnica per le mie basilari conoscenze...non so da che parte cominciare!!! Comunque grazie lo stesso...ne ho imparate tante di cose, imparerò anche questa!

Pinky Profilo | Junior Member

Le cose da dire sarebbero tante e io non sono buono a fare riassunti.
Se ti ho creato qualche dubbio con il mio post ti chiedo scusa,
posso provare a spiegarti quello che non ti è chiaro in maniera più semplice ... nessun problema.
(Ma non è detto che ci azzecco sempre!)

Scusa la domanda... perchè ASP?
Io da zero ho cominciato cominciato con l'informatica proprio con JScript, un tutorial per creare una chat in JScript su una rivista del 2001 !!!
Ma oggi l'ASP classic è certamente superato, credo proprio che sarebbe più indicato imparare ASP.NET.

Ciao
Alessandro

lupin23 Profilo | Newbie

Alessandro sei molto disponibile e ti ringrazio per questo. Dunque, io non ho mai studiato xml, quindi per me anche la cosa più semplice è la più complicata! Non ho mai neanche studiato asp: quello che so fare è perchè l'ho imparato da solo su Internet, per questo dico che imparerò anche ad aggiungere un nodo xml! Comunque sull'ASP.net hai ragione e devo darmi un'aggiornata!
Tornando al "problema" forse è meglio fare un po' di pulizia e specifico la struttura del file xml, così da fare chiarezza:

struttura del file gallery.xml

<gallery title="Photo Album" thumbDir="./images/" imageDir="./images/" random="true">
<category name="Nome categoria">
<image>
<date>data</date>
<title>titolo</title>
<desc>descrizione</desc>
<thumb>anteprima</thumb>
<img>immagine</img>
</image>
</category>
</gallery>

Ora, tramite il file save.asp, devo ottenere questo risultato:

<gallery title="Photo Album" thumbDir="./images/" imageDir="./images/" random="true">
<category name="Nome categoria">
<image>
<date>data</date>
<title>titolo</title>
<desc>descrizione</desc>
<thumb>anteprima</thumb>
<img>immagine</img>
</image>
<image>
<date>nuova_data</date>
<title>nuovo_titolo</title>
<desc>nuova_descrizione</desc>
<thumb>nuova_anteprima</thumb>
<img>nuova_immagine</img>
</image>
</category>
</gallery>

Il file save.asp, aggiornato con alcune modifiche, è ora questo:

<%@LANGUAGE = JScript%>
<%
var oggetto = new ActiveXObject("Microsoft.XMLDOM");
oggetto.async = false;
oggetto.load(Server.MapPath("gallery.xml"));

percorso = oggetto.createElement("image")
var root = oggetto.documentElement.appendChild(percorso);

var img = root.appendChild(oggetto.createElement("img"));
vfile = Request.Form("file");
img.text = (vfile);

var thb = root.appendChild(oggetto.createElement("thumb"));
thb.text = (vfile);

var dsc = root.appendChild(oggetto.createElement("desc"));
dsc.text = Request.Form("text");

var dat = root.appendChild(oggetto.createElement("date"));
dat.text = Request.Form("dat");

var tit = root.appendChild(oggetto.createElement("title"));
tit.text = Request.Form("tit");

oggetto.save(Server.MapPath("gallery.xml"));

Response.Redirect ("notifica.asp")
%>

Attualmente, con questo codice in save.asp, ottengo questo risultato:

<gallery title="Photo Album" thumbDir="./images/" imageDir="./images/" random="true">
<category name="Nome categoria">
<image>
<date>data</date>
<title>titolo</title>
<desc>descrizione</desc>
<thumb>anteprima</thumb>
<img>immagine</img>
</image>
</category>
<image>
<date>nuova_data</date>
<title>nuovo_titolo</title>
<desc>nuova_descrizione</desc>
<thumb>nuova_anteprima</thumb>
<img>nuova_immagine</img>
</image>

</gallery>

quando il risultato che dovrei ottenere è il primo che ho postato (quello dopo la struttura generica).
Dove sbaglio nel codice (Alessandro, anche se oggetto non ti piace, non me lo cambiare ti prego , sennò m'incasino ) per arrivare al risultato che voglio ottenere?!?
Ciao e grazie!
Marco

Pinky Profilo | Junior Member

Nel TUO codice cambia
var root = oggetto.documentElement.appendChild(percorso);
in
var root = oggetto.documentElement.firstChild.appendChild(percorso);

Dovrebbe essere sufficiente questo.
------------------------------------------------------------------------------------

1) L'XML che ottenevi (con il nodo "image" creato dopo "category") era perfettamente valido in quanto il nodo root era comunque uno. Erroneamente ti ho detto in precedenza che non lo era. Mio errore.
2) L'ordine dei nodi ottenuti tramite codice è diverso da quello dell'esempio, metti i vari "desc", "thumb", "img" ecc... nell'ordine voluto.

Ti allego un esempio di come avrei fatto la pagina, spero ti possa dare qualche spunto.
Solitamente i file che il codice deve creare/modificare vanno in una cartella apposita ("Public" va per la maggiore) dove l'utente di processo IUSR_NOMEMACCHINA ha i permessi opportuni (creazione e scrittura), questo per lasciare il solo permesso di lettura su tutto il resto del sito.
Ecco perchè nel mio esempio uso la sottocartella Public, ovvero il path "Public\\nomeFile".
Ed anche, non meno importante, per separare i file delle pagine dai dati.

Nel mio esempio uso "XPath" per trovare il nodo "category" in sostituzione di "oggetto.documentElement.firstChild".
In futuro ti può tornare utile dacci solo uno sguardo per vedere quanto è flessibile..., per adesso prendi per buono il fatto che "\\xxx" significa trova il nodo "xxx" dal nodo corrente in poi, in qualunque posizione sia.

Prendi confidenza con la gestione degli errori. Il mio non è un buon esempio ma è già qualcosa.


Ciao

lupin23 Profilo | Newbie

Ciao, come sempre grazie della disponibilità. Purtroppo ho frequenti problemi di linead adsl e non rieco e connettermi sempre, perciò scusami per il ritardo nella risposta. Ho scaricato l'esempio e poi proverò anche a fare il cambiamento che mi hai suggerito: appena riesco ti dò notizie. Per ora, ancora grazie!

lupin23 Profilo | Newbie

Pinky, come ti ringrazio?!? Dopo un mese e più ho risolto il problema: sapevo che mancava un nulla alla soluzione ma non ci arrivavo! Al tuo esempio allegato gli ho dato un'occhiata di sfuggita ma appena ho 2 minuti mi metto lì e cerco di capire come funziona! Grazie ancora !
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5