Newsgroup: it.comp.appl.access
Titolo: ERA: C'è qualcuno che usa MSXML2 ?


Grazie Serrgio per la risposta, ma ancora non riesco a capire come si possa 
usare l'XML fornito dalla classe MSXML2.
Ho inserito le tue istruzioni e provato con i 4 siti indicati nella routine 
stessa, ma l'area che mi aspetterei valorizzata con la pagina senza i TAG in 
effetti è sempre di lunghezza zero. Che errore commetto ?
Io ho aggiunto il riferimento a "Microsoft XML, v5.0" ritenendolo corretto, 
ma forse ne dovrei aggiungere qualcun altro ?
Quello che mi ripropongo di fare è un'applicazione che legga le quotazioni 
della borsa di Milano in un qualsiasi sito che le fornisce gratuitamente 
(per es. una delle tante banche) e costruisca una tabella con i dati storici 
di tutti i titoli e la possibilità di visualizzare solo quelli che hanno una 
variazione interessante.
Ecco la routine che ho provato:
    Dim oHttp As New MSXML2.xmlHttp
'    txtRequestString = "
http://www.visual-basic.it
"
'    txtRequestString = "
http://www.google.it
"
'    txtRequestString = "
http://www.posteitaliane.it
"
    txtRequestString = "
http://www.sitocomune.com
"
    oHttp.Open "GET", txtRequestString, False
    oHttp.send
    Dim arcotext As String
    Dim arcoxml As String
    Dim lungar As Integer
    arcotext = oHttp.responseText
    lungar = Len(arcotext)
    If lungar > 32000 Then lungar = 32000
    MsgBox Len(arcotext) & " " & Left(arcotext, lungar)
Open "FILEPROV.XML" For Output Shared As #1
Print #1, Left(arcotext, lungar)
Close
Dim oDomDoc As MSXML2.DOMDocument
Set oDomDoc = CreateObject("MSXML2.DOMDocument")
oDomDoc.Load "FILEPROV.XML"
'''''''''''oDomDoc.Load "c:\temp\provaxml.xml"
arcoxml = oDomDoc.xml
'''''''''''Debug.Print oDomDoc.xml
    lungar = Len(arcoxml)
    If lungar > 32000 Then lungar = 32000
    MsgBox Len(arcoxml) & " " & Left(arcoxml, lungar)
Sergio, non mi abbandonare !!!
Grazie ancora
Antonio

 Antonio
Scusa Antonio, la cosa principale è capire se i siti che hai indicato forniscono quelle informazioni e in quale formato e sopratutto 
se sono riconoscibili nel codice html.
Se nelle pagine non trovi dati XML è inutile incaponirsi anche perché le regole dell'XML sono rigidissime e se non vengono 
rispettate non ottieni nulla.
L'HTML dovrebbe rispondere alle stesse regole ma in effetti non è così e qualcosa riesci ad ottenere.
Ora; prendiamo ad esempio un sito che ti interessa monitorare e vediamo quali problemi incontriamo.
Resto in attesa...
Ciao.
-- 
Sergio MAZZA 

 ha scritto nel messaggio 
news:di39f4$n5j$1...@area.cu.mi.it...

Allora, Sergio, eccomi ad illustrare quello che vorrei fare.
Vorrei accedere a 26 pagine (quante le lettere dell'alfabeto inglese) del 
sito di 
borsaitalia.it
 e leggere le quotazioni dei vari titoli, fra tutte le 
altre cose che ogni pagina mi dà. Dovrei avere, quindi, delle stringhe piene 
di cose inutili, ma fra queste c'è anche il dettaglio di ogni titolo con 
tutte le informazioni che vorrei memorizzare (quotazione, percentuale 
incremento/decremento, ecc., ecc.). Le cose si complicano molto perchè, 
oltre a caratteri che dovrei sicuramente saltare (testate, aree 
pubblicitarie, ecc.), trovo anche i caratteri per la formattazione delle 
singole righe o addirittura dei singoli campi. Questo mi complica molto la 
routine che vorrei scrivere, anche perchè non avrei problemi a saltare 
stringhe del tipo "Titoli che iniziano per lettera A", mentre mi diverrebbe 
estremamente difficile saltare stringhe del tipo "<html><head><meta 
http-equiv="Page-Enter" content="progid:DXImageTransform.......".
Da ignorante praticone quale sono, mi è parso di capire che l'XML dovrebbe 
eliminare tutte quelle cose strane necessarie solo alla formattazione della 
pagina in HTML e lasciare solo le cose testuali. Forse questa idea è 
sbagliata, allora quale strada percorrere per ottenere quello che mi sono 
prefisso ?
Ecco la routine utilizzata per l'ultima prova...
    Dim oHttp As New MSXML2.xmlHttp
'    txtRequestString = "
http://www.visual-basic.it
"
'    txtRequestString = "
http://www.google.it
"
'    txtRequestString = "
http://www.posteitaliane.it
"
'    txtRequestString = "
http://www.sitocomune.com
"
    txtRequestString = 
"
http://www.borsaitalia.it/bitApp/quotes.bit?target=SearchQuotes&grp=iniziale&param=A&lang=it
"
    oHttp.Open "GET", txtRequestString, False
    oHttp.send
    Dim arcotext As String
    Dim arcoxml As String
    Dim lungar As Long
    arcotext = oHttp.responseText
    lungar = Len(arcotext)
    If lungar > 32000 Then lungar = 32000
    MsgBox Len(arcotext) & " " & Left(arcotext, lungar)
Open "FILEPROV.XML" For Output Shared As #1
Print #1, Left(arcotext, lungar)
Close
Dim oDomDoc As MSXML2.DOMDocument
Set oDomDoc = CreateObject("MSXML2.DOMDocument")
''''''''''oDomDoc.Load "c:\temp\provaxml.xml"
oDomDoc.Load "FILEPROV.XML"
'''''''''''Debug.Print oDomDoc.xml
arcoxml = oDomDoc.xml
    lungar = Len(arcoxml)
    If lungar > 32000 Then lungar = 32000
    MsgBox Len(arcoxml) & " " & Left(arcoxml, lungar)
... Quale idea mi puoi suggerire ?
Grazie
Antonio

 Antonio
Allora; sto' facendo delle prove è l'unico riferimento che hai per avere i dati della tabella è leggere il nome associato 
all'attributo Class del tag HTML Table.
Ossia; sembra che la tabella con i dati inizi sempre così:
<table class="tabWhite" ...>
...
</table>
Il problema è leggendo il testo contenuto nella tabella esce fuori:
Alitalia-10 Cv 7,5%99,70-0,2914.45.3899,62100,0099,62Negoziazione
Alleanza Ass9,965+0,0914.50.349,8910,009,92Negoziazione
Amplifon58,46-0,9114.50.3458,3059,9759,00Negoziazione
ArquatiSospensione
Art'E'13,28-0,1614.48.0713,2213,4113,41Negoziazione
Asm Brescia2,5875+0,2114.47.242,572,60252,595Negoziazione
Astaldi5,70-0,6114.50.505,665,855,77Negoziazione
Autogrill Spa11,75-0,7914.46.1611,7011,8411,77Negoziazione
Autostrada To-Mi15,86+0,6714.50.5615,7516,1015,75Negoziazione
Autostrade20,26-0,4414.50.2120,1920,4020,34Negoziazione
Autostrade Merid37,45-0,9310.55.0037,4537,4537,45Pre-chiusura
Azimut6,66-0,4514.48.246,666,726,67Negoziazione
Azimut 09 Cv 3,15%111,60-0,2912.50.02111,51111,89111,51Negoziazione
Senza un separatore dei dati è un casino.
Questo è un esempio che funziona, almeno i dati li scarica e li memorizza:
Sub leggiDaInternet()
On Error GoTo scriviSuInternetExplorer_err
Dim oApp As InternetExplorer
Dim oDocument As IHTMLDocument
Dim oTbl As Object
Dim oTblRow As Object
Dim oTblCll As Object
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("BorsaItalia")
Set oApp = CreateObject("InternetExplorer.Application")
oApp.Navigate2 "
http://www.borsaitalia.it/bitApp/quotes.bit?page=2&grp=iniziale&target=SearchQuotes&param=A
"
Do
    DoEvents
    If oApp.ReadyState = READYSTATE_COMPLETE Then
        Exit Do
    End If
Loop
'oApp.Visible = True
Set oDocument = oApp.Document
Dim rigaHTML As String, riga As Integer, cella As Integer
For Each oTbl In oDocument.getElementsByTagName("TABLE")
    If oTbl.className = "tabWhite" Then
        For Each oTblRow In oTbl.Rows
            riga = riga + 1
            If riga > 2 Then '<-- salta le prime due righe
                rst.AddNew
                For Each oTblCll In oTblRow.Cells
                    cella = cella + 1
                    If cella > 1 Then '<-- salta la prima cella
                        rst(cella) = oTblCll.innerText
                    End If
                Next
                rst.Update
                cella = 0
            End If
        Next
    End If
Next
scriviSuInternetExplorer_exit:
    rst.Close
    Set rst = Nothing
    Set oDocument = Nothing
    Set oApp = Nothing
    Exit Sub
scriviSuInternetExplorer_err:
    oApp.Quit
    Set rst = Nothing
    Set oDocument = Nothing
    Set oApp = Nothing
    MsgBox Application.AccessError(Err.Number) & ", " & Err.Number
End Sub
la tabella si chiama: BorsaItalia e ha 8 campi in formato testo (255 caratteri), i nomi te li puoi inventare.
Buon lavoro...
Ciao.
-- 
Sergio MAZZA 

 Ahio... Cominciamo male...
Ma quanto acchiappa sta pelata...
Mi sa che conviene portarmi avanti col lavoro di rasatura (anche se di molto
poco!!!)
-- 
_ _
Ciao
MAssimiliano Amendola            
www.accessgroup.it
Cisa - Conferenza Italiana per Sviluppatori Access
Info:  
www.donkarl.com/it

 Info:  
www.donkarl.com/it
Veramente dovresti portarti "dietro" visto che davanti non c'è da lavorare 
molto!
Ciao.
-- 
Sergio MAZZA 

 Ciao.
E' che per la mia capoccia voglio tutti gli optional, soprattuto gli esterni
in pelle!!!



Sergio !!! sei stato GRANDE :-)))))))))
Bravissimo. In pochissimo tempo hai messo su la routine che fa al caso mio.
E poi ho visto che non hai usato la classe MSXML2 che credevo fosse 
necessaria, ma un altro metodo che rende la routine molto più snella e 
semplice di come la stavo pensando io.
In verità non sono riuscito ad arrivare alla lettera Z perchè si blocca 
prima, occasionalmente alla lettera L o alla Q, poi alla P... ma questi sono 
dettagli ininfluenti: l'importante è che mi hai messo sulla giusta strada.
Allego la routine con poche istruzioni di modifica che ho evitato di 
indentare per renderle più evidenti.
Ho preferito inserire la routine in una sub richiamata da un pulsante, così 
posso anche visualizzare la lettera che sta elaborando.
Però un'ultima domanda te la voglio fare. Non conosco quasi nessuna delle 
classi che si possono incorporare (riferimenti), comprese quelle che hai 
usato tu. Mi potresti consigliare qualche libro che tratta appunto di queste 
cose che direi sono avanzate rispetto a tabelle, query, istruzioni 
elementari, ecc. Eventualmente anche qualche sito in cui poter ritrovare 
queste cose, ma possibilmente (anzi quasi necessariamente) in italiano.
Option Compare Database
Option Explicit
Private Sub Comando0_Click()
On Error GoTo Err_Comando0_Click
' Riferimenti necessari:
' Microsoft Internet Controls
' Microsoft HTML Object Library
' Microsoft DAO 3.6 Object Library
On Error GoTo scriviSuInternetExplorer_err
Dim oApp As InternetExplorer
Dim oDocument As IHTMLDocument
Dim oTbl As Object
Dim oTblRow As Object
Dim oTblCll As Object
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("BorsaItalia")
Set oApp = CreateObject("InternetExplorer.Application")
Dim sito As String, partefissa As String
Dim lettera As String, pagina As Integer
Dim primotitolodipagina As String, arco1 As String
Dim iniziodipagina As Boolean
partefissa = 
"
http://www.borsaitalia.it/bitApp/quotes.bit?lang=it&grp=iniziale&target=SearchQuotes
"
lettera = "A"
pagina = 1
tornasu:
sito = partefissa & "&param=" & lettera & "&page=" & Mid$(Str$(pagina), 2)
oApp.Navigate2 sito
Me.lettera = lettera
Me.Refresh
Do
    DoEvents
    If oApp.readyState = READYSTATE_COMPLETE Then
        Exit Do
    End If
Loop
'oApp.Visible = True
Set oDocument = oApp.Document
Dim rigaHTML As String, riga As Integer, cella As Integer
For Each oTbl In oDocument.getElementsByTagName("TABLE")
    If oTbl.className = "tabWhite" Then
iniziodipagina = True
riga = 0
cella = 0
        For Each oTblRow In oTbl.Rows
            riga = riga + 1
            If riga > 2 Then '<-- salta le prime due righe
                rst.AddNew
                For Each oTblCll In oTblRow.Cells
                    cella = cella + 1
If cella >= 9 Then Exit For
                    If cella > 1 Then '<-- salta la prima cella
                        rst(cella) = oTblCll.innerText
arco1 = Trim(rst(cella))
If iniziodipagina And primotitolodipagina = arco1 Then GoTo dopociclo
If iniziodipagina Then primotitolodipagina = arco1
iniziodipagina = False
                    End If
                Next
                rst.Update
                cella = 0
            End If
        Next
    End If
Next
pagina = pagina + 1
GoTo tornasu
dopociclo:
If lettera = "Z" Then GoTo scriviSuInternetExplorer_exit
lettera = Chr(Asc(lettera) + 1)
pagina = 1
sito = partefissa & "&param=" & lettera & "&page=" & Mid$(Str$(pagina), 2)
GoTo tornasu
scriviSuInternetExplorer_exit:
    rst.Close
    Set rst = Nothing
    Set oDocument = Nothing
    Set oApp = Nothing
    Exit Sub
scriviSuInternetExplorer_err:
    oApp.Quit
    Set rst = Nothing
    Set oDocument = Nothing
    Set oApp = Nothing
    MsgBox Application.AccessError(Err.Number) & ", " & Err.Number
    Exit Sub
'    Dim stAppName As String
'
'    stAppName = "leggiDaInternet"
'    Call Shell(stAppName, 1)
Exit_Comando0_Click:
    Exit Sub
Err_Comando0_Click:
    MsgBox Err.Description
    Resume Exit_Comando0_Click
End Sub
Ciao e grazie ancora
Antonio

 Antonio
-- 
Sergio MAZZA