Newsgroup: it.comp.lang.visual-basic
Titolo: Deserializzazione XML, reprise [lungo e incasinato]

Qualche tempo fa si discusse qui dell'argomento.
Ho provato, smanettato, ma evidentemente mi mancano le basi
per arrivare a quello che voglio, o almeno per arrivarci nel
modo che voglio io.
 
In breve: ho degli XML, ho usato il tool XSD per creare
i file .XSD e .VB, li inserisco nel progetto e ottengo la
mia brava classe.
[Vedere esempio in fondo al post]
Accedo ai file seguendo tutti i passi imparati nel thread
precedente, deserializzo un file e ottengo la mia brava classe
riempita. Dentro, OK, i dati ci sono, ma una cosa ancora
non l'ho capita:
perché se al campo accedo col nome, ottengo tutto, *meno*
quello che mi serve, cioè il dato contenuto ?
Perché non c'è una ca...ppero di proprietà .Value e stop ?
Per accederci, cioè per avere il vero e proprio "dato", quello
che nell'XML è fra virgolette, devo per forza usare l'indice
dell'item ?
Visto che conosco il nome del campo, non posso accedere al dato
con quello ?
Perché devo scansionare tutti gli elementi cercando quello
che come caption ha lo stesso nome del campo stesso ?
 
Mi sembra una cosa di una semplicità estrema, quindi penso
che la possibilità ci sia, e sono io a non capire il trucco,
ma è un po' che ci giro intorno e non ne vengo fuori...
 
******** Segue esempio. ********
 
Stralcio delle prime righe dal file XML:
<?xml version="1.0"?>
-<PubPlan>
	<pubInfo time="qui c'è l'orario" pubDate="120117" pressName="R1" 
pdfCode="blabla1" masterPages="120" editionName="blablabla2: blabla" 
edition="blabla3" description="blabla4"/>
[CUT]
[segue serie di altri elementi]
</PubPlan>
 
Stralcio del codice (funzionante :-) grazie, Nicola.)
 
         Dim objStreamReader As New StreamReader(NomeFile)
         Dim x As New XmlSerializer(GetType(PubPlan))
         Dim Timone As New PubPlan
         Timone = x.Deserialize(objStreamReader)
         objStreamReader.Close()
 
E fin qui tutto OK.
Ora provo l'accesso ai dati:
         Debug.Print(Timone.DataSetName)
--->  PubPlan
         Debug.Print(Timone.pubInfo.pdfCodeColumn.ColumnName)
--->  pdfCode
         Debug.Print(Timone.pubInfo.pressNameColumn.ColumnName)
--->  pressName
         Debug.Print(Timone.pubInfo.pubDateColumn.Caption)
--->  pubDate
 
Fin qui ci siamo.
 
Ora, io vorrei fare un
         Debug.Print(Timone.pubInfo.PressName)
oppure
         Debug.Print(Timone.pubInfo.PressName.Value)
o magari
         Debug.Print(Timone.pubInfo.PressName.Data)
e ottenere (ovviamente col necessario casting)
-->R1
ma pare che non ci sia verso...
 
L'unica maniera che ho trovato è stata fare un loop
di tutti i dati e cercare quello con la caption giusta,
il che mi sembra il top dell'assurdo e l'antitesi
del concetto di object oriented:
 
For N = 0 To Timone.Tables.Count - 1
  For M = 0 To Timone.Tables.Item(N).Rows.Count - 1
   For H = 0 To Timone.Tables.Item(N).Columns.Count - 1
     If (Timone.Tables.Item(N).Rows(M).Table.Columns(H).Caption) _
= "PressName" Then
Debug.Print (Timone.Tables.Item(N).Rows(M).Item(H).ToString)
 
Qualcuno mi illumina ?
 
Bye, G.

 Qualcuno mi illumina ?
 
diciamo che è normale perchè xsd.exe è pensato per genererare DataSet, 
quindi una struttura tabellare fatta da colonne (gli attributi del tuo 
xml) e righe i nodi del tuo xml.
 
e nel tuo esempio PubPlan è un perfetto data set dove c'è una tabella 
pabinfo con le colonne time, pubDate, etc...
 
.m
 
-- 
blog @ //
milestone.topics.it
 
 
 

 pabinfo con le colonne time, pubDate, etc...
 
Yep, grazie. Il che significa che devo per forza accedere
con degli indici, sperando che, come da specifiche, siano
fissi. Solo che ho avuto già brutte sorprese nel campo,
non so se mi spiego.
 
Oppure, riflettendo sul fatto che alla fine è pur sempre
codice, mica la Bibbia... potrei modificare la classe
creata da XSD e aggiungere un riferimento .Value come
serve a me :-D.
 
Bye, G.

 serve a me :-D.
 
anche, oppore un tentativo che potresti fare è:
- usare xsd.exe per generare lo schema dato il tuo xml;
- usare l'editor visuale per manipolare l'xsd generato fino a 
"trimmarlo" a quello che tiserve;
- deserializzare usando l'xsd custom;
