Monday, October 5, 2009

LinqToXml: esempio con Dictionary

XML sorgente:
<xml version="1.0" encoding="utf-8"?>
<Configurations>
<ListFormStruct Name="ListFormPippo" DataFileName="DataFileNamePippo">
<Struct>
<Column Name="Column1" StartByte="0" Length="12" Type="String" />
<Column Name="Column2" StartByte="13" Length="10" Type="Int" />
<Column Name="Column3" StartByte="24" Length="10" Type="DateTime" />
<Column Name="Column4" StartByte="35" Length="10" Type="String" />
</Struct>
</ListFormStruct>
</Configurations>


Le entità che utilizzeremo sono:

public sealed class ColumnStruct
{
public int Length { get; set; }
public int StartByte { get; set; }
public DataType Type { get; set; }
}

per le colonne e:

public class ListFormStruct
{
public string FileDataName { get; set; }
public string Name { get; set; }
public Dictionary<string, ColumnStruct> Columns { get; set; }
}


per la lista che conterrà anche l’elenco delle colonne.
Per la lista delle colonne abbiamo inserito una dictionary in modo da avere le colonne con una chiave univoca che sarà il nome della colonna stessa.

Ed ecco come leggeremo questo XML in modo da istanziare direttamente l’oggetto:

class Program
{
static void Main(string[] args)
{
XDocument xdoc = XDocument.Load(@"..\..\XMLFile4.xml");
ListFormStruct lfs = (from q in xdoc.Descendants("ListFormStruct")
select new ListFormStruct
{
FileDataName = q.Attribute("DataFileName").Value,
Name = q.Attribute("Name").Value,
Columns = q.Element("Struct")
.Elements("Column").ToDictionary(
c => (string)c.Attribute("Name"),
c => new ColumnStruct()
{
Length = (int)c.Attribute("Length"),
StartByte = (int)c.Attribute("StartByte"),
Type = (string)c.Attribute("Type")
})
}).FirstOrDefault();
if (lfs != null)
{
Console.WriteLine("Name: {0}; FileDataName: {1}", lfs.Name, lfs.FileDataName);

foreach (string colName in lfs.Columns.Keys)
{
Console.WriteLine("Column Name: {0}:", colName);
ColumnStruct col = lfs.Columns[colName];
Console.WriteLine(@"\tLength: {0}; StartByte: {1}; Type: {2}", col.Length, col.StartByte, col.Type);
Console.WriteLine();
}
}
}
}

Divertitevi

No comments:

Post a Comment