如何将任何XElement反序列化为对象

时间:2012-08-31 09:39:14

标签: c# .net dynamic xml-parsing

我希望能够在代码中使用任何XElement,并将其直接放入Razor视图中作为动态模型。

无论XElement的内容如何,​​如何自动将XElement解析为动态对象?

4 个答案:

答案 0 :(得分:1)

所以,我试过这个。我想我现在明白为什么没有广泛的代码来做这件事,并邀请你的评论,编辑和批评:

    private dynamic LoadFromXElement(XElement source)
    {
        var name = source.Name.LocalName;
        var descendants = source.Descendants().ToList();

        dynamic result = new ExpandoObject();
        var resultDict = result as IDictionary<string, object>;

        if (descendants.Count == 0)
        {
            resultDict[name] = source.Value;
            return result;
        }
        var dynamicDescendants = descendants.Select(element => LoadFromXElement(element)).ToList();

        resultDict["element"] = dynamicDescendants;

        return result;

    }

那就是说,我已经对这种方法做了一些改进......

答案 1 :(得分:0)

如果您使用的是C#4,可以查看ExpandoObject

提供的链接示例将以下XML反序列化为动态Person对象列表:

<Persons>
    <Person>  
        <FirstName> Dino </FirstName>
        <LastName> Esposito </LastName>
    </Person>
    <Person>
        <FirstName> John </FirstName>
        <LastName> Smith </LastName>
    </Person>  
 </Persons>

解析代码:

public static IList<dynamic> GetExpandoFromXml(String file) 
{ 
    var persons = new List<dynamic>();

    var doc = XDocument.Load(file);
    var nodes = from node in doc.Root.Descendants("Person")
                select node;

    foreach (var n in nodes) 
    {
        dynamic person = new ExpandoObject();
        foreach (var child in n.Descendants()) 
        {
            var p = person as IDictionary<String, object>);
            p[child.Name] = child.Value.Trim();
        }
        persons.Add(person);
    }
    return persons;
}

答案 2 :(得分:0)

尝试此扩展程序

public static T Deserialize<T>(this  XmlReader xml)
    {

        if (xml == null)
        {
            return default(T);
        }

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

        var settings = new XmlReaderSettings();
        // No settings need modifying here




        return (T)serializer.Deserialize(xml);


    }

和电话

var obj = xElement.CreateReader().Deserialize<objectType>();

答案 3 :(得分:-1)

将它投射到动态?

var xele = new XElement("foo", "bar");
    var p = (dynamic)xele;
    Console.Write(p.Name);

或者你想达到什么目标?