Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di kluster
    Registrato dal
    Jul 2003
    Messaggi
    1,288

    CLASSE: RsXmlParser: Convertire da Recordset ad Xml e viceversa

    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
    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>
    nota: per il code di vbullettin non viene interpretato bene il CDATA che in realta è il seguente (l'ho spaziato):
    < ! [ CDATA [ VALORE CAMPO ] ] >

    esempio di output di un ipotetica tabella TBL_DATA con una query = "select * from tbl_data;" si ottiene un output simile:
    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>
    Le operazioni di conversione (e salvataggio) del recordset in formato Xml sono le seguenti:
    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
    	%>
    per la lettura del file xml un esempio un po' + completo che illustra anche le altre proprieta':
    codice:
    	(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  %>
    DOM

    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.
    codice:
    xmlParser.RsToXml Rs,"TBL_DATA"xmlParser.Mysql,"KEY",xmlParser.ResponseAndBuffer
    oppure
    codice:
    xmlParser.RsToXml Rs,"TBL_DATA",xmlParser.Mdb,"KEY",xmlParser.ResponseNow
    oppure
    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.
    codice:
    'Caricamento di un file Dim myRs
    Set MyRs = xmlParser.XmlToRs("file.xml",xmlParser.fromFile)
    oppure
    codice:
    Set MyRs = xmlParser.XmlToRs(myStringXml,xmlParser.fromString)
    Nota: sia il file caricato che la stringa caricata devono rispecchiare la struttura di cui sopra
    METODO:
    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:
    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
    PROPRIETA':
    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)

  2. #2
    Mmm, mi sa che tu mi potresti tornare utile.
    Sono appena tornato da un esame e soo fuso... dammi una conferma.

    Per ASG sto implementando un sistema di export dei dati in XML.
    Se non vado errato potrei usare questa classe per esportare i report dal db in XML vero?

    Mi sa che magari ci metto anche le mani ed aggiungo l'uso di XLS così mi evito di riscrivere 2 classi da 0.

  3. #3
    Utente di HTML.it L'avatar di kluster
    Registrato dal
    Jul 2003
    Messaggi
    1,288
    si per l'esportazione l'ho fatta e per ajax ( per tradurre in interrogazione al db in xml e lato client per ritrasformarla in recordset)

    un esempio spicciolo

    Set Rs = ObjConn.Execute("Select * form tbl_stats")
    Set obj = new RsXmlParser
    obj.RsToXml(rs,"tbl_stats",obj.mysql,"id_stat",obj .BufferOnly)
    obj.SaveXml("tbl_stat.xml",obj.Overwrite)

    e salvi il file in xml
    per caricarlo

    Set obj = new RsXmlParser
    Dim rs
    Set rs = obj.XmlToRs("tbl_stat.xml",obj.FromFile)

    ed hai in rs tutto quello che ti pare, è disconnesso sicchè se vuoi fare qulacosa con il db devi aprire una connessione

  4. #4
    Utente di HTML.it L'avatar di kluster
    Registrato dal
    Jul 2003
    Messaggi
    1,288
    ho fatto un esempio di comunicazione tra server diversi:
    il server a interroga la pagina sul server b passando sql e cose necessarie (da notare che DbType non serve cmq) che butta fuori l'xml, il server A a questo punto converte l'xml in recordset (ho tralasciato la elaborazione del recordset

    SERVER A:
    pagina estraiDaAltroServer.asp
    codice:
    <%
    	Set Xml = Server.CreateObject("Microsoft.XMLHTTP")
    	Set obj	= new RsXmlParser
    	table	= Server.URLEncode("tbl_data")
    	sql	= Server.URLEncode("Select * from tbl_data")
    	tableKey= "key"
    	dbType	= obj.mdb
    	'Set Xml= CreateObject("MSXML2.ServerXMLHTTP.4.0")
    	Url     = "http://www.SERVERB.com/outputXml.asp"
    	Url	= Url & "?tableName=" & table & "&sql=" & sql &_
            "&tableKey=" & tableKey & "&dbType=" & dbType 
    	Xml.Open  "GET", Url,false
    	Xml.Send()  
            'questo è quello che basta
            
    	Set myRs= obj.xmlToRs(Xml.ResponseText,obj.FromString)
            
    	Set Xml = nothing 
    %>
    
    a questo punto myRs è un recordset che si puo' manipolare
    SERVER B
    pagina outputXml.asp
    codice:
    
    <%
    	Set obj	= new RsXmlParser
    	cnString= "PROVIDER=Microsoft.Jet.OleDb.4.0;Data Source=" & Server.MapPath("test.mdb")
    	table 	= Request("tableName")
    	tableKey= request("tableKey")
    	sql	= Request("sql")
    	dbType	= obj.mdb
    	Set conn= Server.CreateObject("ADODB.Connection")
    	conn.open cnString
    	Set rs	= conn.execute(sql)
    	Response.ContentType = "text/xml"
    	obj.RsToXml 	Rs,table,dbType,tableKey,obj.ResponseNow 
    	conn.close
    	Set conn= nothing
    	set Rs	= nothing
    	Set obj	= nothing
    %>
    certo non è una soluzione sicura tanto meno in get pero' intanto è funzionale
    modificando il recordset e richiamando la funzione
    obj.rsToXml() e ripassandola via XmlRequest ad una pagina update.asp (che a sua volta converte in rs ed aggiorna il db) a questo punto è possibile aggiornare il db tra server

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.