Oppure

Loading
25/01/09 10:11
gvigliani
Ciao a tutti ed un grazie anticipato a chi vorra' aiutarmi. Ho un file xml e dal quale devo estrapolare i dati in esso contenuti. La sua rchitettura è clssica se non per qualche modifica avvenuta al suo interno.
=================================== 2 Detail
<Entry>
<Percentage>99.90</Percentage>
<Return>0.10</Return>
<Event>APOLLON LIMASSOL # ALKI LARNACA</Event>
<BetKind>Back/Lay</BetKind>
<Runner>Apollon Limassol</Runner>
<BetType>1X2</BetType>
<Description>Sportingbet: 1.45 / BetssonExchange: 1.45</Description>
<Date>25/01/2009</Date>
<GUID>d57bd1c151c24d7e9a1acf3d6a4dee23</GUID>
<IsNew>False</IsNew>
<DetectionDate>25/01/2009</DetectionDate>
<Details>
<Detail>
<Name>Apollon Limassol</Name>
<BetKindEntry>Back</BetKindEntry>
<BookerId>6</BookerId>
<Booker>Sportingbet</Booker>
<RawOdds>1.450</RawOdds>
<Volume>0</Volume>
<Commission>0.00</Commission>
<EntryIndex>1</EntryIndex>
<EntrySubIndex>-1</EntrySubIndex>
<League>Cypriot League Matches </League>
</Detail>
<Detail>
<Name>Apollon Limassol</Name>
<BetKindEntry>Lay</BetKindEntry>
<BookerId>33</BookerId>
<Booker>BetssonExchange</Booker>
<RawOdds>1.430</RawOdds>
<Volume>10</Volume>
<Commission>4.00</Commission>
<EntryIndex>2</EntryIndex>
<EntrySubIndex>-1</EntrySubIndex>
<League>Cyprus Division 1</League>
</Detail>
</Details>
</Entry>
==============================================
-------------------------------- 3 Detail
<Entry>
<Percentage>98.48</Percentage>
<Return>1.52</Return>
<Event>BOLOGNA # AC MILAN</Event>
<BetKind>Back All</BetKind>
<Runner>N/A</Runner>
<BetType>Asian Handicap +0/-0</BetType>
<Description>(6.68@PinnacleSports/3.61@PinnacleSports) 4.83 - 1.29 @ 888Sport</Description>
<Date>25/01/2009</Date>
<GUID>98e636761e72452dafe270705ad4d181</GUID>
<IsNew>False</IsNew>
<DetectionDate>25/01/2009</DetectionDate>
<Details>
<Detail>
<Name>Bologna</Name>
<BetKindEntry>Back</BetKindEntry>
<BookerId>22</BookerId>
<Booker>PinnacleSports</Booker>
<RawOdds>6.680</RawOdds>
<Volume>0</Volume>
<Commission>0.00</Commission>
<EntryIndex>1</EntryIndex>
<EntrySubIndex>1</EntrySubIndex>
<League>Serie A</League>
</Detail>
<Detail>
<Name>Draw</Name>
<BetKindEntry>Back</BetKindEntry>
<BookerId>22</BookerId>
<Booker>PinnacleSports</Booker>
<RawOdds>3.610</RawOdds>
<Volume>0</Volume>
<Commission>0.00</Commission>
<EntryIndex>1</EntryIndex>
<EntrySubIndex>2</EntrySubIndex>
<League>Serie A</League>
</Detail>
<Detail>
<Name>AC Milan - 0</Name>
<BetKindEntry>Back</BetKindEntry>
<BookerId>44</BookerId>
<Booker>888Sport</Booker>
<RawOdds>1.286</RawOdds>
<Volume>0</Volume>
<Commission>0.00</Commission>
<EntryIndex>2</EntryIndex>
<EntrySubIndex>-1</EntrySubIndex>
<League>Italian Serie A</League>
</Detail>
</Details>
</Entry>
<Entry>


Come si puo' evincere l'xml è diviso in piu' parti.
La prima che fa capo al nodo Entry ( e fin qui tutto bene) con i suoi componenti che sono 10.
Al di sotto di questo nodo ce n'è un altro (Details) con altri sottonodi (Detail).
Leggerli non sarebbe un problema ma questo nasce nel momento in cui i sottonodi (Detail) sono in numero di 2 o 3.
Dovendo mettere questi dati in una griglia, succede che partendo dal primo nodo (Entry) accedo al primo componente che è Percentage. Mi posiziono sulla colonna 0 della griglia ed incrementando la riga mi stampo nella griglia tutti i record. Faccio cosi' fino all'ultimo componente che è DetectionDate e ripeto per tutti la stessa prassi. Mi porto sulla colonna successiva, riparto dalla riga 1 (la 0 è occupata dalle intestazioni) e mi riempio in verticale la griglia stessa. Quando però arrivo al sottonodo (Details/) non sapendo a priori quanti sottonodi (Detail) ci sono il riempimento della griglia si sfalsa perche' a volte lo riempie con 2 ed altre volte con 3 elementi successivi. Potete aiutarmi a risolvere il problema?

Grazie
aaa
25/01/09 10:43
GrG
mm..nn so se ho capito bene comunque io ho capito che tu hai un blocco (<Details></Details>;) e all'interno ci sono vari blocchi(Detail) però tu non sai quanti ce ne sono infatti potrebbero essere ad esempio 2:
<Details>
<Detail> (primo blocco)
...
</Detail>
<Detail> (secondo blocco)
...
</Detail>
</Details>

Ma ce ne potrebbe essere anche magari solo 1 blocco oppure 3 quindi il numero dei blocchi <Detail> può variare...quindi a te serve capire quanti blocchi <Detail> ci sono giusto?
Se si allora con la funzione Instr() devi trovare il numero dei blocchi <Detail> in questo modo:
'nella sub di un button
dim stringa as string, i as integer
'in stringa poi tu metterai il codice xml
i = 1
do
if instr(i, stringa, "<Detail>") > 0 then
i = i + 1
else
msgbox "Numero detail:" &  (i - 1)
i = 1
end if
doevents
loop until i = 1
' al posto del msgbox il numero di <Detail> te li salvi in una variabile
'resto del codice


Se non è questo ciò che ti serviva spiegati meglio...
aaa
25/01/09 10:55
gvigliani
Purtroppo con questo metodo io trovo solo il numero di Detail nel file totale e non nel blocco XML. Ogni blocco è formato da:

Entry
primo record
secondo record
E.mo record
Details
Detail
primo record
secondo record
E.mo record
Detail
primo record
secondo record
E.mo record
Detail(opzionale)
primo record (opzionale)
secondo record (opzionale)
E.mo Record (Opzionale)

in un file xml come quello che ti ho mandato, di blocchi come questi potrebbero essercene a centinaia quindi con il tuo codice posso sapere quante voci detail in totale ci sono nel file ma non quante ce ne sono all'interno del singolo blocco Entry.
Spero di essere stato un po' piu' chiaro.
Grazie

aaa
25/01/09 11:31
GrG
ah ora ho capito...bè potresti usare la funzione Split per dividere i vari blocchi e così ricerchi in ogni singolo blocco...come carattere delimitatore puoi usare <Entry>
aaa
25/01/09 11:55
gvigliani
Dim strsource As String, prova As String
strsource = Inet.OpenURL(ind_ricerca)
prova = Split(strsource, "Entry";)

stavo facendo una prova ma mi da errore "Tipo non corrispondente". Eppure prova è una stringa ed anche strsource.
Dove sta l'inghippo?

Grazie
aaa
25/01/09 11:56
gvigliani
Dim strsource As String, prova As String
strsource = Inet.OpenURL(ind_ricerca)
prova = Split(strsource, "Entry";)

stavo facendo una prova ma mi da errore "Tipo non corrispondente". Eppure prova è una stringa ed anche strsource.
Dove sta l'inghippo?

Grazie
aaa
25/01/09 12:01
GrG
prova deve essere un array quindi devi dichiararlo così: dim prova() as string
ATTENZIONE: come delimitatore non usare "entry" ma "<entry>".
Se il codice xml è fatto così:
<entry>
...
</entry>
<entry>
...
</entry>

sono due blocchi quindi prova avrà 2 elementi cioè prova(0) e prova(1) e ognuno contiene un blocco
aaa
25/01/09 12:13
gvigliani
No, è un lavoro immane e poi i blocchi in quel pezzetto di codice sono 2 ma nell'intero file sono centinaia e dovrei ricontrollarli uno ad uno perdendo il fattore principale del mio lavoro. La velocita' di aggiornamento.
Dovra' pur esserci un modo di lavorare in un file xml in modo che non si debbano leggere i tutti i record in un blocco con For Each ... next
Questo perche' se io riesco a leggere un record alla volta posso sapere a priori a seconda del valore di BetType se il blocco avra' 2 o 3 Detail.
In pratica vorrei poter leggere il primo valore di ogni blocco , verificarlo ed andare avanti. Mentre con For Each Next me li legge tutti in sequenza.
Grazie
aaa