Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - XMLReader con numero variabile di tag
Forum - C# / VB.NET - XMLReader con numero variabile di tag

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
BitterLemon (Normal User)
Newbie


Messaggi: 10
Iscritto: 06/09/2010

Segnala al moderatore
Postato alle 18:10
Lunedì, 18/10/2010
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

Codice sorgente - presumibilmente VB.NET

  1. Dim xmR As XmlReader = XmlReader.Create(link)
  2.  
  3. xmR.ReadToFollowing("nomeset")
  4. Dim nomeset As String = xmR.ReadElementContentAsString()
  5. xmR.ReadToFollowing("natura")
  6. Dim natura As String = xmR.ReadElementContentAsString()
  7.  
  8. 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 il 18/10/2010 alle 20:49
PM
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Up
1
Down
V
Segnala al moderatore
Postato alle 21:19
Lunedì, 18/10/2010
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:

Codice sorgente - presumibilmente Plain Text

  1. <Pokemons>
  2. <Pokemon>
  3. <Name>Abomasnow</Name>
  4. <Dex>460</Dex>
  5. <NomeSet>SubSeed</NomeSet>
  6. <Natura>Timid</Natura>
  7. </Pokemon>
  8. <Pokemon>
  9. [...]
  10. </Pokemon>
  11. </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: http://msdn.microsoft.com/en-us/library/ms733901.aspx

Ultima modifica effettuata da netarrow il 18/10/2010 alle 21:20
PM
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Up
1
Down
V
Segnala al moderatore
Postato alle 23:52
Martedì, 19/10/2010
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):
Codice sorgente - presumibilmente C# / VB.NET

  1. XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Pokemon>));
  2.    
  3. using (StreamWriter writer = new StreamWriter())
  4. {
  5.   xmlSerializer.Serialize(writer, pokemons); //pokemons è la tua lista di oggetti
  6. }



Leggi (deserializza):
Codice sorgente - presumibilmente C# / VB.NET

  1. XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Pokemon>));
  2.    
  3. using (StreamReader reader = new StreamReader())
  4. {
  5. List<Pokemon> obj = (List<Pokemon>)  xmlSerializer.Deserialize(reader);
  6. }



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: http://www.google.it/#hl=it&biw=1280&bih=613&q=XmlSerializ ...

Ultima modifica effettuata da netarrow il 19/10/2010 alle 23:56
PM
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Up
1
Down
V
Segnala al moderatore
Postato alle 23:03
Mercoledì, 20/10/2010
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:

Codice sorgente - presumibilmente C# / VB.NET

  1. ...
  2.            WebRequest request = WebRequest.Create(url);  
  3.             WebResponse response = request.GetResponse();  
  4.             Stream s = response.GetResponseStream();
  5.             StreamReader stream = new StreamReader(s);
  6. XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Pokemon>));
  7. List<Pokemon> obj = (List<Pokemon>)  xmlSerializer.Deserialize(stream);
  8. ...



Se proprio ti mancano le basi potresti studiare questa parte dalla guida di Totem: http://totemslair.org/guide/viewchapter.php?guida=vb&id=100

PM
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Up
1
Down
V
Segnala al moderatore
Postato alle 22:47
Venerdì, 22/10/2010
Puoi usare dei tool per convertire i linguaggi .NET, tipo http://www.developerfusion.com/tools/convert/csharp-to-vb/

PM
Avatar
BitterLemon (Normal User)
Newbie


Messaggi: 10
Iscritto: 06/09/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 20:48
Martedì, 19/10/2010
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) ?

PM
Avatar
BitterLemon (Normal User)
Newbie


Messaggi: 10
Iscritto: 06/09/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 16:05
Mercoledì, 20/10/2010
Ho tradotto il codice in questo modo

Codice sorgente - presumibilmente VB.NET

  1. Dim XmlSerializer As xmlSerializer = new XmlSerializer(typeof(List<Pokemon>))
  2.         Dim writer As StreamWriter = New StreamWriter("C:\tmp.xml")
  3.  
  4.         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.

PM
Avatar
BitterLemon (Normal User)
Newbie


Messaggi: 10
Iscritto: 06/09/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 22:33
Venerdì, 22/10/2010
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).

Codice sorgente - presumibilmente C# / VB.NET

  1. XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Pokemon>));
  2. List<Pokemon> obj = (List<Pokemon>)  xmlSerializer.Deserialize(stream);


PM
Avatar
BitterSweet (Normal User)
Newbie


Messaggi: 5
Iscritto: 07/11/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 15:09
Domenica, 07/11/2010
Sono BitterLemon, ma ho avuto problemi con l'impronta biometrica e l'indirizzo email e ho dovuto creare un nuovo account :(
Ho però un problema, non ho capito cosa devo sostituire a List<Pokemon> nella conversione in vb.net

PM
Pagine: [ 1 2 3 ] Precedente | Prossimo