2009-11-05 3 views
0

пытается «оттепель» сериализованные объекты, которые были сохранены в файле XML:LinqToXml против LinqToSql

В LinqToSql, я могу (с соответствующим украшенным классом) делаю этот вид вещи:

[Table(Name="Plants")] 
    public class Plant 
    { 
     [Column(Name = "Id", IsPrimaryKey = true)] 
     public int Id { get; set; } 
     [Column(Name = "Genus")] 
     public string Genus { get; set; } 
     [Column(Name = "Species")] 
     public string Species { get; set; } 
     [Column(Name = "CommonName")] 
     public string CommonName { get; set; } 
     ... 
    } 

позже сделать это:

using (DataContext db = new DataContext(ConnectString)) 
{ 
    plants = (
     from d in db.GetTable<Plant>() 
     select d).ToList(); 
} 

и данные из таблицы SQL используются для заполнения списка <> объектов растений.

Но с LinqToXML я не могу показаться, чтобы сделать этот трюк, а я должен сделать что-то вроде этого:

<!-- XML File --> 
<Plants> 
    <Plant> 
     <Genus>Quercus</Genus> 
     <Species>alba</Species> 
     <CommonName>White Oak</CommonName> 
    </Plant> 
    ... 
</Plants> 

    // Class 
    [DataContract] 
    [XmlRoot("Plants")] 
    public class Plant 
    { 
     [DataMember] 
     public string Genus { get; set; } 
     [DataMember] 
     public string Species { get; set; } 
     [DataMember] 
     public string CommonName { get; set; } 
     ... 
    } 

// Code -- note: I already have the XML file in an XDocument called "doc" 
IEnumerable<XElement> items = (from item in doc.Descendants("Plant") 
    where item.Element("Genus").Value.Equals("Quercus") 
    select item); 

List<Plant> plants = new List<Plant>(); 
foreach (XElement item in items) 
{ 
    Plant a = new Plant(); 
    a.Genus = item.Element("Genus").Value; 
    a.Species = item.Element("Species").Value; 
    XElement ex = item.Element("CommonName"); 
    if ((null == ex) || ex.IsEmpty) { } else { a.Example = ex.Value; } 
    plants.Add(a); 
} 

Учитывая, что я хотел бы сделать это сериализации/десериализации общего назначения, есть способ сделать это, не прибегая к размышлениям? Я могу использовать XmlSerializer, но это также связано с большим количеством беспорядков с MemoryStreams и использованием их как XmlWriter или XmlReaders, когда все, что я хочу, - это сделать мой класс автоматически перемещенным в/из XML-файла. Просто интересно, если я не могу подключить точки здесь ...

ответ

1

Я боюсь, что вы смешиваете DataContracts и LinqToXML.

Вы можете использовать DataContracts для десериализации документа Xml для объекта.

После десериализации вы можете использовать LinqToObjects для запроса набора данных.

Дайте это попробовать:

[CollectionDataContract(Name = "Plants", ItemName = "Plant", Namespace = "")] 
class Plants: List<Plant> { } 

[DataContract(Name = "Plant", Namespace = "")] 
class Plant 
{ 
    [DataMember()] 
    public string Genus { get; set; } 

    [DataMember()] 
    public string Species { get; set; } 

    [DataMember()] 
    public string CommonName { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var fs = new FileStream("Plants.xml", FileMode.Open)) 
     using (var reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas())) 
     { 
      var ser = new DataContractSerializer(typeof(Plants)); 

      var plants = ser.ReadObject(reader) as Plants; 

      foreach (var plant in plants) 
       Console.WriteLine("{0}, {1}, {2}", plant.Genus, plant.Species, plant.CommonName); 
     } 

     Console.ReadKey(); 
    } 
} 
Смежные вопросы