2012-12-04 18 views
40

ile Nesne için XML'yi Nesne Deserialize Etme Mümkün mü?Dinamik

var xml = @"<Students><Student><Name>Arul</Name><Mark>90</Mark></Student></Students>"; 

var serializer = new XmlSerializer(typeof(DynamicObject)); 

dynamic students = serializer.Deserialize(new XmlTextReader(new StringReader(xml))); 
+9

Neden sadece denemiyorsun? –

+0

onu istisna atmaya çalıştı ama Json için aynı mantık çalışmasını neden xml ile desteklemiyor – user1875919

+0

Olası çoğaltması [XML'i dinamik bir C# nesnesine dönüştürme] (https://stackoverflow.com/questions/13171525/converting-xml-to- a-dynamic-c-sivri nesne) –

cevap

66

Bunu denemek isteyebilirsiniz.

string xml = @"<Students> 
       <Student ID=""100""> 
        <Name>Arul</Name> 
        <Mark>90</Mark> 
       </Student> 
       <Student> 
        <Name>Arul2</Name> 
        <Mark>80</Mark> 
       </Student> 
      </Students>"; 

dynamic students = DynamicXml.Parse(xml); 

var id = students.Student[0].ID; 
var name1 = students.Student[1].Name; 

foreach(var std in students.Student) 
{ 
    Console.WriteLine(std.Mark); 
} 

public class DynamicXml : DynamicObject 
{ 
    XElement _root; 
    private DynamicXml(XElement root) 
    { 
     _root = root; 
    } 

    public static DynamicXml Parse(string xmlString) 
    { 
     return new DynamicXml(XDocument.Parse(xmlString).Root); 
    } 

    public static DynamicXml Load(string filename) 
    { 
     return new DynamicXml(XDocument.Load(filename).Root); 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     result = null; 

     var att = _root.Attribute(binder.Name); 
     if (att != null) 
     { 
      result = att.Value; 
      return true; 
     } 

     var nodes = _root.Elements(binder.Name); 
     if (nodes.Count() > 1) 
     { 
      result = nodes.Select(n => n.HasElements ? (object)new DynamicXml(n) : n.Value).ToList(); 
      return true; 
     } 

     var node = _root.Element(binder.Name); 
     if (node != null) 
     { 
      result = node.HasElements || node.HasAttributes ? (object)new DynamicXml(node) : node.Value; 
      return true; 
     } 

     return true; 
    } 
} 
+4

Birden çok öğe yalnızca tek bir öğenin başarısız olmasıyla döndürülürse ve bunu bir foreach'de kullanıyorsanız, bu harika çalışır! "Result = new DynamicXml (node);" değiştirmeyi öneririm; "sonuç = yeni Liste () {new DynamicXml (node)};" tek bir öğe ile bir liste döndürecektir. –

+0

Öznitelik değerlerini ayarlama veya alma, TrySetIndex/TryGetIndex ile daha iyi yapılır. Bu yüzden, gibi bir elemanımız varsa, isim niteliğine ulaşmak için sözdizimi kişi ["isim"] olur. –

+1

@RezoMegrelidze Ama bunu 'person.name' olarak uygulamak istedim. –