Mi rendo conto che questo è un vecchio post, ma di recente ho letto alcuni XML in oggetti. Non ero entusiasta di Linq per XML - non è molto leggibile, si basa su "stringhe magiche" e richiede modifiche al codice se lo schema XML cambia.
Per chiunque sia interessato, utilizzo la classe XmlSerializer
per deserializzare l'XML in oggetti. Inserire il codice di deserializzazione in un metodo di supporto generici, e voilà - una riga di codice per deserializzare un file XML in un oggetto grafico: -
using System.IO;
using System.Xml.Serialization;
class Program
{
static void Main(string[] args)
{
var xml = @"<?xml version='1.0' encoding='utf-8' ?>
<Model>
<Points>
<Point name='P1' pressure='1'>
<Fractions>
<Fraction id='aaa' value='0.15272159'/>
<Fraction id='bbb' value='0.15272159'/>
</Fractions>
</Point>
</Points>
</Model>";
var model = DeserializeObject<Model>(xml);
}
private static T DeserializeObject<T>(string xml)
{
var serializer = new XmlSerializer(typeof(T));
using (var tr = new StringReader(xml))
{
return (T)serializer.Deserialize(tr);
}
}
}
public class Model
{
[XmlArrayItem("Point")]
public Point[] Points { get; set; }
}
public class Point
{
[XmlAttribute(AttributeName = "name")]
public string Name { get; set; }
[XmlAttribute(AttributeName = "pressure")]
public int Pressure { get; set; }
[XmlArrayItem("Fraction")]
public Fraction[] Fractions { get; set; }
}
public class Fraction
{
[XmlAttribute(AttributeName = "id")]
public string Id { get; set; }
[XmlAttribute(AttributeName = "value")]
public double Value { get; set; }
}
Un paio di avvertenze: -
Questa soluzione si basa, ovviamente, sulla decorazione dei modelli di dominio con attributi XML, che possono o non possono essere accettabili per te. La soluzione si basa anche su un elemento esterno presente nell'XML e non funzionerà se l'elemento radice è un array (<Points>
in questo esempio).
Non è possibile specificare IEnumerable<>
(menzionato dall'OP); puoi utilizzare gli array o List<>
.
fonte
2014-04-01 10:47:55
Potrebbe voler verificare null o la vostra applicazione esploderà. –
@Wouter: grazie! Funziona molto bene. Posso creare subquery? O dovresti fare due domande? Vedi la mia modifica per favore –
@PedroDusso Ho aggiunto del codice per la selezione nidificata –