Oppure

Loading
18/10/10 16:10
BitterLemon
Buonpomeriggio,

con XMLReader ho bisogno di leggere vari XML simili a questo come struttura

<strategydex>
<pokemon>Abomasnow</pokemon>
<dex>460</dex>
[...]
<nomeset0>SubSeed</nomeset0>
<natura0>Timid</natura0>
[...]
<nomeset1>Scarfer</nomeset1>
<natura1>Adamant</natura1>
[...]
</strategydex>

Il problema è che per ogni XML ci sono vari tag simili a <nomesetX> e <naturaX> (e altri) con X variabile (min 0).
Nel mio progetto iniziale non avevo preso la cosa in considerazione e avevo proceduto considerando un solo <nomeset> e <natura> in questo modo

Dim xmR As XmlReader = XmlReader.Create(link)

xmR.ReadToFollowing("nomeset")
Dim nomeset As String = xmR.ReadElementContentAsString()
xmR.ReadToFollowing("natura")
Dim natura As String = xmR.ReadElementContentAsString()

TextBox1.Text = "Set: " + nomeset + vbCrLf + "Natura: " + natura


Pensavo di fare in questo modo: Leggo tutti i tag, magari con un ciclo For, e li inserisco in un array per ogni tipo (ex: array "nomeset" --> tutti i valori dei tag di nome "nomesetX";).
Ultima modifica effettuata da BitterLemon 18/10/10 18:49
aaa
18/10/10 19:19
netarrow
Quello che vuoi fare tu è serializzare un array di oggetti.
Creare n tag con un indice nel nome non è la cosa giusta da fare.

Devi avere un file XML ad esempio così strutturato:

<Pokemons>
<Pokemon>
<Name>Abomasnow</Name>
<Dex>460</Dex>
<NomeSet>SubSeed</NomeSet>
<Natura>Timid</Natura>
</Pokemon>
<Pokemon>
[...] 
</Pokemon>
</Pokemons>


Poi crei una classe che rappresenta l'entità, esponendo quindi le proprietà Nome, Dex, NomeSet, Natura e tutto quello che ti serve.

Poi per "salvare" serializzi una lista di oggetti, per caricare la deserializzi.

Come esempi ne tovi parecchi in giro per la rete, un punto di partenza è sicuramente msdn: msdn.microsoft.com/en-us/library/…
Ultima modifica effettuata da netarrow 18/10/10 19:20
aaa
19/10/10 18:48
BitterLemon
Ciao netarrow, grazie per la risposta.
Ho creato la classe e impostato la serializzazione e non ci sono problemi, tranne per quanto riguarda il parsing del file XML.
Ho cercato su internet ma non ho trovato risposta, ho provato vari metodi tra cui un while dove prelevavo i Value di xmr.Read, ma non ho ottenuto l' effetto desiderato.
Come posso fare per prelevare tutti i value dell' XML (presente sul web, lo ricordo) ?
aaa
19/10/10 21:52
netarrow
Non è necessario fare il parsing del xml con XmlSerializer, lo fa lui.

Ecco due esempi (sono in C# ma non cambia niente, le classi sono quelle):

Salva (serializza):
XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Pokemon>));
    
using (StreamWriter writer = new StreamWriter())
{
  xmlSerializer.Serialize(writer, pokemons); //pokemons è la tua lista di oggetti
}



Leggi (deserializza):
XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Pokemon>));
    
using (StreamReader reader = new StreamReader())
{
List<Pokemon> obj = (List<Pokemon>)  xmlSerializer.Deserialize(reader);
}


I vincoli per rendere serializzabile la tua entità è che i campi da serializzare siano pubblici e che ci sia un costruttore di default (senza parametri)

Se vuoi maggiori dettagli ti rimando ad altri esempi che puoi trovare in giro: google.it/
Ultima modifica effettuata da netarrow 19/10/10 21:56
aaa
20/10/10 14:05
BitterLemon
Ho tradotto il codice in questo modo

        Dim XmlSerializer As xmlSerializer = new XmlSerializer(typeof(List<Pokemon>))
        Dim writer As StreamWriter = New StreamWriter("C:\tmp.xml")

        XmlSerializer.Serialize(writer, "a")


Ho solo due problemi: il primo è che XMLSerializer.Serialize vuole un riferimento all' oggetto e poi non so come estrarre i dati dall' XML online =(

Non ho mai toccato il campo nè della serializzazione nè degli XML in vb.net quindi perdonami per la mia insistenza.
aaa
20/10/10 21:03
netarrow
Serialize richiede un riferimento all'oggetto perchè persisti su xml un'istanza specifica.

Puoi anche non usare la serializzazione e solo deserializzare, cioè preparare l'oggetto scrivendo l'XML a mano.

Per quanto riguarda il fatto di avere l'xml sul web non è un problema in lettura, infatti potresti usare un WebRequest:

...
           WebRequest request = WebRequest.Create(url);  
            WebResponse response = request.GetResponse();  
            Stream s = response.GetResponseStream(); 
            StreamReader stream = new StreamReader(s); 
XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Pokemon>));
List<Pokemon> obj = (List<Pokemon>)  xmlSerializer.Deserialize(stream);
...


Se proprio ti mancano le basi potresti studiare questa parte dalla guida di Totem: totemslair.org/guide/…
aaa
22/10/10 20:33
BitterLemon
Ciao netarrow e grazie per gli aiuti :)
Ho un problema a tradurre queste due righe dal C# che ahimè non conosco (il resto ci sono riuscito con un pò di logica).

XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Pokemon>)); 
List<Pokemon> obj = (List<Pokemon>)  xmlSerializer.Deserialize(stream);
aaa
22/10/10 20:47
netarrow
Puoi usare dei tool per convertire i linguaggi .NET, tipo developerfusion.com/tools/convert/csharp-to-vb/
aaa