Я понимаю, что это старый пост, но я недавно начал читать XML-объекты. Я не был заинтересован в Linq to XML - он не очень читабелен, использует "волшебные строки" и требует изменений кода при изменении схемы XML.
Для всех, кто интересуется, я использую класс XmlSerializer
для десериализации XML в объекты. Поместите код десериализации в универсальный вспомогательный метод и вуаля - одну строку кода для десериализации файла XML в граф объектов: -
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; }
}
Несколько предостережений: -
Это решение, очевидно, основано на украшении моделей предметной области атрибутами XML, которые могут быть или не быть приемлемыми для вас. Решение также опирается на внешний элемент, присутствующий в XML, и не будет работать, если корневой элемент является массивом (<Points>
в этом примере).
Невозможно указать IEnumerable<>
(о котором упоминается ОП); Вы можете использовать массивы или List<>
.