Newsgroup: it.comp.lang.visual-basic
Titolo: [? VBScript e VB6] Caratteri non validi in foglio XML

Salve a tutti,
una domanda al volo:
Io recupero dati da un DB e creo un foglio XML con questo codice:
Dim rs
 Dim stm
..........
rs.Save stm, adPersistXML
Response.ContentType = "text/xml"
Response.Write stm.ReadText
stm.Close
rs.Close
Set stm = Nothing
Set rs = Nothing
Se nel recordset non ci sono caratteri strani tutto funziona correttamente.
Se in uno dei campi ci sono dei caratteri accentati ad esempio mi torna un
errore. Credo di dover usare dei caratteri di Escape. Sapete mi ca se esiste
un comando per sostituire automaticamente questi caratteri e poi
ripristinare la situazione in fase di lettura del foglio XML?
Grazie 1000

Inserisci questo all'inizio del file xml
<?xml version="1.0" encoding="UTF-8" ?>
Ciao.

 ha scritto nel messaggio
news:arg065$s7h$1...@newsreader.mailgate.org...


Esempio in vb
questa č una solozione
Set xmldocument = New MSXML2.DOMDocument
xmldocument.async = False
xmldocument.Load XmlPath 'č il file che hai appena salvato
Dim xmldocument2 As MSXML2.DOMDocument
Dim domPi As MSXML2.IXMLDOMProcessingInstruction 'Dichiarazione per
l'inserimento dell'encoding
Set xmldocument2 = New DOMDocument
xmldocument2.async = False
xmldocument2.preserveWhiteSpace = True
'inserisco la versione e l'encoding
Set domPi = xmldocument.createProcessingInstruction("xml", "version='1.0'
encoding='UTF-8'")
xmldocument2.appendChild domPi
xmldocument2.appendChild xmldocument.childNodes(0)
xmldocument2.save App.Path & "\proviamo.xml"
'---------la seconda e che tenti di aggiungere solo questa
istruzione-------------
Dim domPi As MSXML2.IXMLDOMProcessingInstruction 'Dichiarazione per
l'inserimento dell'encoding
Set xmldocument2 = New DOMDocument
xmldocument2.async = False
xmldocument2.preserveWhiteSpace = True
'inserisco la versione e l'encoding
Set domPi = xmldocument.createProcessingInstruction("xml", "version='1.0'
encoding='UTF-8'")
xmldocument2.appendChild domPi

 ha scritto nel messaggio
news:arg183$t8n$1...@newsreader.mailgate.org...


Non riesco a capirti tu i dati che recuperi dal Db li recuperi
con un recordset ado?

 ha scritto nel messaggio
news:arg3su$vaf$1...@newsreader.mailgate.org...


Allora se salvi il record set direttamente con l'ado senza usare lo stream
non ti dovrebbe dare problemi
nella visualizzazione dei caratteri , xche ci pensa lui.
Esempio
Dim Cnn As ADODB.Connection
Dim rs As New ADODB.Recordset
Dim rstr As New ADODB.Stream
WPATH = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path &
"\miodb.mdb;Jet OLEDB:Database Password=;Mode=ReadWrite|Share Deny
None;Persist Security Info=False"
   Set Cnn = New ADODB.Connection
   Cnn.ConnectionString = WPATH
   Cnn.Open
   rs.Open "Select nome campo from tabella", Cnn, adOpenStatic,
adLockPessimistic
   rs.save App.Path & "\test.xml", adPersistXML
   rs.Close
'-----------------------------
Tu usi lo stream e sinceramente adesso non ho tra le mani l'help
che ti serve.
Non so come lo pololi lo stream potresti postare un pezzo di codice.
Ciao

 ha scritto nel messaggio
news:arg5fb$qu$1...@newsreader.mailgate.org...


"Marcolino7" <pi...@pippo.pip> ha scritto nel messaggio
news:EFSC9.33706$744.1...@news1.tin.it...

Allora forse ho le idee un po' confuse.
Ma a cosa ti serve loggetto stream di ado?
Quello che so è che viene utilizzato come in questo esempio
dConst adExecuteStream = 1024
Const MSSQLXML_DIALECT = "{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"
Dim conDB As ADODB.Connection
Dim cmdXML As ADODB.Command
Set conDB = CreateObject("ADODB.Connection")
With conDB
'.Provider = "SQLOLEDB"
.ConnectionString = "Provider=SQLOLEDB.1;Password=XXX;Persist Security
Info=True;User ID=XXXX;Initial Catalog=Northwind;Data Source=BC-PROTO"
.open
End With
Set cmdXML = CreateObject("ADODB.Command")
'Assign the Connection object to the Command object.
Set cmdXML.ActiveConnection = conDB
Dim stmXMLin As ADODB.Stream
Set stmXMLin = CreateObject("ADODB.Stream")
Dim strQry As String <----Crea la Query XLM----
strQry = strQry & "<Invoice xmlns:sql='urn:shemas-microsoft-com:xml-sql'>"
strQry = strQry & "<sql:query>"
strQry = strQry & "Select OrderID, OrderDate from Orders"
strQry = strQry & " Where OrderID=10248 FOR XML AUTO"
strQry = strQry & "</sql:query></Invoice>"
' Write query to inbound stream.
stmXMLin.open
stmXMLin.WriteText strQry, adWriteChar
' Set Stream object position to the beginning
stmXMLin.Position = 0
' Assign Stream object to Command object.
Set cmdXML.CommandStream = stmXMLin
' Create stream for outbound result.
Dim stmXMLout As ADODB.Stream
Set stmXMLout = CreateObject("ADODB.Stream")
' Assign the result stream.
stmXMLout.open
cmdXML.Properties("Output Stream") = stmXMLout
' Execute the query.
cmdXML.Execute , , adExecuteStream
' 
strXML = Replace(stmXMLout.ReadText, ">", ">" & Chr(10) + Chr(13))
MsgBox strXML, vbInformation,"Xml Invoce"
Questo funziona solo su sql server
Lo stream nel tuo pezzo di codice a cosa ti serve?
Tu vuoi mostrea il risultato di una query in formato XML?
Se si l'approccio è diverso da usare.
ciao

Ho rifatto tutto da Asp e a me Funziona.
Ora ho capito č una rotine per la gestione degli errori
che restituisce l'output in  formato Xml.
<%@ Language=VBScript %>
<%
  Option Explicit
  Const adLockPessimistic = 2
  Const adOpenkeyset = 1
  Const adPeRSistXML = 1
  Const adStateOpen = 1
  Const adVarChar = 200
  Const adInteger = 3
  Dim CONN                               ' Connessione
  Dim RS                                 ' RecordSet
  Dim XMLStream                          ' Stream XML
  ' Apertura della Connessione e del RecordSet
  On Error Resume Next
  Set RS = Server.CreateObject("ADODB.Recordset")
  Set CONN = Server.CreateObject("ADODB.Connection")
  CONN.ConnectionString = "DSN=mio;uid=xxx;pwd=xxx"
  CONN.Open
  RS.Open "SELECT * FROM TDESESTA", CONN, adOpenkeyset, adLockPessimistic
%>
<%
  ' Gestione degli errori
  If Err Then
    If RS Is Nothing Then Set RS = Server.CreateObject("ADODB.Recordset")
    With RS
      If .State = adStateOpen Then .Close
      .Fields.Append "Type", adVarChar, 9
      .Fields.Append "Source", adVarChar, 50
      .Fields.Append "Description", adVarChar, 255
      .Fields.Append "Code", adInteger
      .Source = ""
      .ActiveConnection = Nothing
      .Open
      .AddNew
      .Fields("Type") = "##Error##"
      .Fields("Source")= Err.Source
      .Fields("Description") = Server.URLEncode(Err.Description)
      .Fields("Code") = Err.Number
      .Update
    End With
  End If
  On Error Goto 0
%>
<%
  ' Salvataggio del RecordSet in Stream XML
  Set XMLStream = Server.CreateObject("ADODB.Stream")
  RS.Save XMLStream, adPersistXML        ' Salva il RecordSet nello stream
%>
<%
  ' Chiusura del RecordSet/Connessione ed invio dei dati
  RS.Close
  CONN.Close
  Set RS = Nothing
  Set CONN = Nothing
  Response.ContentType = "text/xml"      ' Header XML
  Response.Write XMLStream.ReadText      ' Invia il testo dello Stream
  XMLStream.Close
  Set XMLStream = Nothing
%>

 Ora ho capito è una rotine per la gestione degli errori
