2012-12-04 7 views
40

알 수없는 XML을 deserialize하여 다음과 같은 객체를 직렬화 할 수 있습니까?동적 XML을 사용하여 XML을 비 직렬화

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

왜 당신은 그것을 시도하지? –

+0

나는 던져 예외를 던지려고했지만 Json에서 작동하는 동일한 논리가 왜 XML을 지원하지 않는가? – user1875919

+0

[XML을 동적 C# 객체로 변환] 가능한 복제본 (https://stackoverflow.com/questions/13171525/converting-xml-to- a-dynamic-c-sharp-object) –

답변

66

시도해 볼 수 있습니다.

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

하나의 요소 만 실패하고 foreach에서 사용하면 여러 요소가 반환되는 경우이 기능이 유용합니다! 나는 "결과 = 새로운 DynamicXml (노드);" "결과 = 새 목록 () {새 DynamicXml (노드)};" 단일 요소가있는 목록을 반환합니다. –

+0

TrySetIndex/TryGetIndex를 사용하면 속성 값을 설정하거나 가져 오는 것이 좋습니다. 따라서 와 같은 요소가 있다면 name 속성에 도달하는 구문은 person [ "name"]이됩니다. –

+1

@RezoMegrelidze 그러나 나는 이것을'person.name'으로 구현하고 싶었습니다. –

관련 문제