Facendo dei test con Ajax ho avuto la necessita' di sviluppare la seguente classe.
Spero che sia utile a qualcuno. Sono ben accette considerazioni, suggerimenti, o critiche:
CLASSE: RsXmlParser() [versione lite]
sourceCode: ClassRsXmlParserLite.zip (18kb) con esempi ed un db access
questa classe ha la funzione di convertire un recordset in formato XML per l'esportazione.
Allo stesso modo é possibile leggere dal un file xml (che abbia la stessa struttura creata dal metodo di scrittura) ed ottenerne un recordset disconnesso.
La classe genera un xml valido (privo di DTD) e ben formattato secondo questa struttura
nota: per il code di vbullettin non viene interpretato bene il CDATA che in realta è il seguente (l'ho spaziato):codice:<?xml version="1.0" encoding="UTF-8"?> <TABLE NAME="[TABLE NAME]" TYPE="['mdb'|'mysql']" FIELDKEY="[CAMPO CHIAVE PRIMARIA]"> <STRUCTURE> <FIELD TYPE="[TIPO CAMPO]" TYPEDESC="[DESCRIZIONE TIPO]" DEFINEDSIZE="[SIZE DEFINITO]">[NOME CAMPO TABELLA]</FIELD> <FIELD TYPE="[TIPO CAMPO]" TYPEDESC="[DESCRIZIONE TIPO]" DEFINEDSIZE="[SIZE DEFINITO]">[NOME CAMPO TABELLA]</FIELD> ....etc etc </STRUCTURE> <ROW> <[NOME_CAMPO]>[CDATA[VALORE CAMPO]></[NOME_CAMPO]> <[NOME_CAMPO]>[CDATA[VALORE CAMPO]></[NOME_CAMPO]> </ROW> ......etc etc </TABLE>
< ! [ CDATA [ VALORE CAMPO ] ] >
esempio di output di un ipotetica tabella TBL_DATA con una query = "select * from tbl_data;" si ottiene un output simile:
Le operazioni di conversione (e salvataggio) del recordset in formato Xml sono le seguenti:codice:<?xml version="1.0" encoding="UTF-8"?> <TABLE NAME="TBL_DATA" TYPE="MDB" KEYFIELD="KEY"> <STRUCTURE> <FIELD TYPE="3" TYPEDESC="INT" DEFINEDSIZE="4">KEY</FIELD> <FIELD TYPE="202" TYPEDESC="TEXT" DEFINEDSIZE="50">TITOLO</FIELD> <FIELD TYPE="7" TYPEDESC="DATE" DEFINEDSIZE="8">DATA</FIELD> </STRUCTURE> <ROW> <KEY>[CDATA[1]></KEY> <TITOLO>[CDATA[Primo Titolo]></TITOLO> <DATA>[CDATA[04/08/2005 2.58.21]></DATA> </ROW> <ROW> <KEY>[CDATA[2]></KEY> <TITOLO>[CDATA[Secondo Titolo]></TITOLO> <DATA>[CDATA[04/08/2005 2.58.26]></DATA> </ROW> ....etc etc </TABLE>
per la lettura del file xml un esempio un po' + completo che illustra anche le altre proprieta':codice:(1) <% Set xmlParser = RsXmlParser strSql = "Select * from tbl_data" Set Conn = Server.CreateObject("Adodb.Connection") 'questo é solo un esempio di stringa di connessione valida Conn.open "PROVIDER=Microsoft.Jet.OleDb.4.0;Data Source=" & Server.MapPath("test.mdb") Set Rs = conn.execute(strSql) Response.ContentType = "text/xml" xmlParser.RsToXml Rs, "TBL_DATA ",xmlParser.Mdb,"KEY",xmlParser.ResponseAndBuffer obj.SaveXml "testMdb.xml ",xmlParser.AllowOverwrite Conn.Close Set conn = nothing Set Rs = nothing %> nel caso utilizziate Mysql il discorso non cambia molto <% Set xmlParser = RsXmlParser strSql = "Select * from tbl_data" Set Conn = Server.CreateObject("Adodb.Connection") 'questo è solo un esempio di stringa di connessione valida Conn.open "DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;DATABASE=test;USER=test;PASSWORD=test;OPTION=3; " Set Rs = conn.execute(strSql) Response.ContentType = "text/xml" xmlParser.RsToXml Rs, "TBL_DATA ",xmlParser.Mysql, "KEY ",xmlParser.ResponseAndBuffer obj.SaveXml "testMysql.xml",xmlParser.Overwrite Conn.Close Set conn = nothing Set Rs = nothing %>
DOMcodice:(2) <% Set obj = new RsXmlParser Set myRs = obj.XmlToRs("testMdb.xml",obj.FromFile) <html> .... <body> Estrazione dal file:<%=obj.XmlFile%> </pre> <table border="1"> <tr> <td>Nome: </td> <td><%=obj.TableName%></td> <td>Tipo: </td> <td><%=obj.DbType%></td> <td>Chiave Primaria: </td> <td><%=obj.TableKey%></td> </tr> </table> <tabl border="1"> <tr> <%For Each Elm in myRs.Fields%> <td><%=elm.name%></td> <%next%> </tr> <% while not myRs.eof%> <tr> <%For Each Elm in myRs.Fields%> <td><%=elm.value%></td> <%next%> </tr> <% myRs.movenext wend %> </table> </body> </html> <% Set obj = nothing Set myRs = nothing %>
METODO:
RsToXml
(ByRef Rs,TableName,DbType,TableKey,Operation)
converte un recordset passato per riferimento in xml valido secondo lo schema di cui sopra
PARAMETRI:
Rs (ADODB.RECORDSET) è il recordset precedentemente creato dall'utente
TableName (String) nome della tabella di estrazione
DbType (String) nome del tipo di mdb, valori possibili "MDB" o "MYSQL", è possibile usare le 2 costanti interne mdb e mysql che incapsulano il valore appropiato
TableKey (String) il nome del campo chiave della tabella
Operation (intero) è un intero che specifica il tipo di operazione:
valori possibili: 0 (pari alla costante ResponseNow) stampa direttamente in Response
1 (pari alla costante ResponseAndBuffer) stampa e salva nel buffer
2 (pari alla costante BufferOnly) salva nel buffer (l'xml sara' accessibile nell'oggetto interno Buffer
Es.
oppurecodice:xmlParser.RsToXml Rs,"TBL_DATA"xmlParser.Mysql,"KEY",xmlParser.ResponseAndBuffer
oppurecodice:xmlParser.RsToXml Rs,"TBL_DATA",xmlParser.Mdb,"KEY",xmlParser.ResponseNow
codice:xmlParser.RsToXml Rs,"TBL_DATA",xmlParser.Mdb,"KEY",xmlParser.BufferOnly ........bla bla bla Response.write(xmlParser.Buffer) 'stampa l'xml
METODO:
XmlToRs(FileOrString,operation)
converte un file xml (o una stringa ben formattata) con lo schema di cui sopra in un recordset disconnesso
PARAMETRI:
FileOrString (string) puo' essere sia il percorso di un file xml sia una stringa xml valido, a seconda del flag settato dal parametro operation
operation (int) è un intero che specifica se il parametro è un file oppure una stringa xml
valori possibili 0 (pari alla costante FromFile) che identifica che si intende caricare un file
o 1 (pari alla costante FromString) che identifica che sin intende caricare una stringa Xml
Es.
oppurecodice:'Caricamento di un file Dim myRs Set MyRs = xmlParser.XmlToRs("file.xml",xmlParser.fromFile)
METODO:codice:Set MyRs = xmlParser.XmlToRs(myStringXml,xmlParser.fromString) Nota: sia il file caricato che la stringa caricata devono rispecchiare la struttura di cui sopra
SaveXml(File,overwrite)
salva il contenuto del buffer di lettura (aperto con RsToXml) su file
PARAMETRI:
File (string) il file che si intende salvare
overwrite (int) è un intero che specifica se il file puo' sovrascrivere l'eventuale file esistente
valori possibili:
2 (pari alla costante Overwrite) che nel caso sovrascrive
1 (pari alla costante NoOverwrite) che non permette la sovrascrizione
Esempio:
PROPRIETA':codice:'Salvataggio del file con sovrascittura xmlParser.SaveXml("pippo.xml",xmlParser.Overwrite) 'uguale a 2 ' Non sovrascrive (emette un output di errore nel caso esista) xmlParser.SaveXml("pippo.xml",xmlParser.NoOverwrite) 'uguale a 1
TableName tipo: string
Il nome della tabella di estrazione, proprieta in sola lettura
(proprieta' in lettura, viene valorizzata alla chiamata dei 2 metodi RsToXml o XmltoRs)
PROPRIETA':
DbType tipo: string
Il tipo di database: MYSQL o MDB, il loro valore è incapsulato nelle costanti mdb e mysql
(proprieta' in lettura, viene valorizzata alla chiamata dei 2 metodi RsToXml o XmltoRs)
PROPRIETA':
TableKey tipo: string
Il nome del campo chiave primaria della tabella (proprieta' in lettura, viene valorizzata alla chiamata dei 2 metodi RsToXml o XmltoRs)
PROPRIETA':
XmlFile tipo: string
(proprieta' in lettura, viene valorizzata alla chiamata dei 2 metodi RsToXml o XmltoRs)
COSTANTI: (in realta' è una simulazione di costante)
Mdb tipo: string
valore "MDB" per essere utilizzata nella definizione del tipo di database
MySql tipo: string
valore "MySql" per essere utilizzata nella definizione del tipo di database
FromFile tipo: int
valore 0 per essere utilizzata nella chiamata al metodo XmlToRs
FromString tipo: int
valore 1 per essere utilizzata nella chiamata al metodo XmlToRs
ResponseNow tipo: int
valore 0 per essere utilizzata nella chiamata al metodo RsToXml , stampa tutto in Response.Write senza buffer
ResponseAndBuffer tipo: int
valore 1 per essere utilizzata nella chiamata al metodo RsToXml , stampa tutto in Response.Write senza buffer
SaveBuffer tipo: int
valore 2 per essere utilizzata nella chiamata al metodo RsToXml , salva l'xml nell'oggetto interno Buffer
Overwrite tipo: int
valore 2 per essere utilizzata nella chiamata al metodo SaveXml , salva l'xml nel file sovrascrivendolo
NoOverwrite tipo: int
valore 1 per essere utilizzata nella chiamata al metodo SaveXml , salva l'xml nel file solo se non esiste
Due piccoli test per la verifica della classe (solo MDB):
Test lettura db con output XML (1)
Test lettura XML e creazione recordset disconnesso (2)
Ps.
Ringrazio tanto imente (alias Mr. Splik, vedi 3d) per lo sviluppo e Baol74 perchè ho utilizzato la sua CstringBuilder (versione ado)

, vedi 3d) per lo sviluppo e Baol74 perchè ho utilizzato la sua CstringBuilder (versione ado)
Rispondi quotando
