Rimuovere nodo XML con variabile

AlexRock

Nuovo Utente
10 Ott 2008
5
0
0
Salve a tutti!

Alessio, 24 anni, siciliano, abbastanza neofita :)

Riguardo a QUESTO script già postato tra gli articoli di questo sito (cancella un nodo di un xml con un valore specifico).
Mi interessava sapere come posso cancellare un nodo a scelta dell'utente (mediante form), quindi attraverso una variabile ID.
Nell'esempio di cui sopra (dell'ottimo Luca) si elimina sempre il nodo con id "3" (come da esempio riportato sotto).
Cosa occorre modificare per eliminare un nodo con l'id scelto dall'utente?

Intanto preparo un asp con un form così composto:

Codice:
<form action="insevento1.asp" method="post" name="new_user_form">
<table>
<tr>
<td>Id:</td>
<td><input name="id" type="text"></td>
</tr>
</table>
<p><input type="submit" name="submit" value="Invia"></p>
</td>
</tr>
</table>


Quindi nell'asp richiamato (insevento1.asp) cosa devo mettere per eliminare l'id con la variabile "id"?
Per semplicità vi ri-posto l'esempio del vs. co-webmaster Luca con l'id "3":

Codice:
<%@LANGUAGE = VBScript%>
<%
    ' Dichiaro le variabili che mi servono
    Dim file, oggetto, canc

    ' Recupero il file XML
    file = Server.MapPath("database.xml")

    ' Apro l'XMLDOM e carico il file XML
    Set oggetto = Server.CreateObject("Microsoft.XMLDOM")
    oggetto.async = False
    oggetto.load file

    ' Recupero il nodo da cancellare
    Set canc = oggetto.SelectSingleNode("database/record[id='3']")

    ' Cancello fisicamente il nodo dal file XML
    oggetto.documentElement.removeChild(canc)

    ' Salvo le modifiche
    oggetto.Save file

    ' Un po di pulizia...
    Set canc = Nothing
    Set oggetto = Nothing

    ' Lancio un messaggio a video
    Response.Write "Nodo cancellato con successo!"
%>

Grazie e scusate la mia idiotaggine :)
alessio.
 
Ciao Alessio, grazie per "ottimo" :)

Nel codice ASP devi recuperare in post (Request.Form) il valore della casella di testo "id" e passarlo in questa riga.

Provo a scrivere il codice mettendo in grassetto le modifiche:

<%@LANGUAGE = VBScript%>
<%
Dim id, file, oggetto, canc
id = Request.Form("id")
If IsNumeric(id) Or id < 1 Then Response.End

file = Server.MapPath("database.xml")
Set oggetto = Server.CreateObject("Microsoft.XMLDOM")
oggetto.async = False
oggetto.load file
Set canc = oggetto.SelectSingleNode("database/record[id='[b]" & id & "[/b]']")
oggetto.documentElement.removeChild(canc)
oggetto.Save file
Set canc = Nothing
Set oggetto = Nothing
Response.Write "Nodo cancellato con successo!"
%>

Non l'ho testato, fammi sapere ;)
 
Che velocità Luca :)

Cmq, ho qualche problema.. e non riesco neanche a capire esattamente quale sia perchè il browser non mi dà errori..

"If IsNumeric(id) Or id < 1 Then Response.End"

Questo significa che se l'id è numerico lo script termina l'esecuzione?

ale.
 
Ultima modifica:
ecco infatti ho tolto il pezzo di stringa "isnumeric" e per adesso funziona :)

Non si può mettere che se è testuale termina lo script?
Com'è la stringa?

ale.
 
Si, fantastico!!! :)

E se per renderlo perfetto mettessimo che se si sceglie un ID inesistente dà un messaggio che dice "id inesistente"?

Sarebbe proprio la ciliegina sulla torta :P

Inoltre, sarebbe fantastico se nell'INSERIRE un nuovo evento nel mio file xml, poco prima del salvataggio si potesse usare un codice per ordinare gli eventi in base all'ID! Sto cercando un pò sulla rete "sort xml id asp" ma trovo ben poco.. più che altro trovo possibilità di ordinare in alfabetico..

Cmq vi posto il codice dell'inserimento evento:

Codice:
		<%

var id = Request.Form("id")
var quando = Request.Form("quando")
var cosa = Request.Form("cosa")

var xmlDoc=Server.CreateObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.load(Server.MapPath("app_data/database.xml"));

var nodeList = xmlDoc.getElementsByTagName("database");

if(nodeList.length > 0){

var parentNode = nodeList(0);
var memberNode = xmlDoc.createElement("record");
var idNode = xmlDoc.createElement("id");
var usernameNode = xmlDoc.createElement("quando");
var emailNode = xmlDoc.createElement("cosa");

idNode.text = id;
usernameNode.text = quando;
emailNode.text = cosa;

parentNode.appendChild(memberNode);
memberNode.appendChild(idNode);
memberNode.appendChild(usernameNode);
memberNode.appendChild(emailNode);

xmlDoc.save(Server.MapPath("app_data/database.xml"));

}

Response.Write "Evento inserito con successo!"

%>

ale.
 
Ultima modifica:
Per la visualizzazione (con ordinamento) puoi usare XSLT:

https://www.mrw.it/xslt/

Per il fatto dell'ID che non esiste puoi fare una cosa, ma devi provare un po.

Mi rifierisco al file .asp.

Prova a modificare cosi:

<%@LANGUAGE = VBScript%>
<%
On Error Resume Next
Dim id, file, oggetto, canc
id = Request.Form("id")
If IsNumeric(id) Or id < 1 Then Response.End
file = Server.MapPath("database.xml")
Set oggetto = Server.CreateObject("Microsoft.XMLDOM")
oggetto.async = False
oggetto.load file
Set canc = oggetto.SelectSingleNode("database/record[id='" & id & "']")
If Err.Number = 0 Then
oggetto.documentElement.removeChild(canc)
oggetto.Save file
Else
Response.Write "Il record " & id & " non esiste"
End If
Set canc = Nothing
Set oggetto = Nothing
Response.Write "Nodo cancellato con successo!"
%>

Se ci fai caso ho gestito gli errori all'inizio, poi ho impostato una condizione: non sono sicuro che la condizione vada impostata esattamente li.

Il senso è che se inserisci un ID inesistente ti da errore; gestendo l'errore, se verifichi che c'è effettivamente errore significa che il record non esiste (e lanci il messaggio) oppure esegui la cancellazione.

Fai qualche test e fammi sapere.

In ogni caso ti consiglio di creare questi applicativi su database: XML è bello e caro, ma il database è più sicuro e malleabile :)

A più tardi!
 
Ti ringrazio enormemente per il tuo preziosissimo aiuto!
Stasera provo anche questa parte dell'id inesistente e ti faccio sapere :)

Si, il database forse è più sicuro.. ma volevo un pò addentrarmi in xml, sembra più veloce, forse meno problematico. Mi piacerebbe proprio creare delle maschere che prendono fonti da più nodi contemporaneamente.. vedremo.. altrimenti torno al caro MySql.

Grazie di tutto!

ale.
 

Discussioni simili