反序列化XML要使用动态对象 [英] Deserialize XML To Object using Dynamic

查看:159
本文介绍了反序列化XML要使用动态对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有可能反序列化XML不明对象像下面?

  VAR XML = @\"<Students><Student><Name>Arul</Name><Mark>90</Mark></Student></Students>\"; VAR串行器=新的XmlSerializer(typeof运算(DynamicObject)); 动态学生= serializer.Deserialize(新的XmlTextReader(新StringReader(XML)));


解决方案

您可能想试试这个。

 字符串XML = @&LT;学生&GT;
                &LT;学生ID =100&GT;
                    &LT;名称&gt;&Arul LT; /名称&gt;
                    &LT;马克和GT; 90°/马克&GT;
                &LT; /学生&GT;
                &LT;的Student GT;
                    &LT;名称&gt;&Arul2 LT; /名称&gt;
                    &LT;马克和GT; 80℃/马克&GT;
                &LT; /学生&GT;
            &LT; /学生和GT;动态学生= DynamicXml.Parse(XML);变种的id = students.Student [0] .ID;
VAR名1 = students.Student [1] .Name点;的foreach(在students.Student VAR STD)
{
    Console.WriteLine(std.Mark);
}


 公共类DynamicXml:DynamicObject
{
    _root的XElement;
    私人DynamicXml(根的XElement)
    {
        _root =根;
    }    公共静态DynamicXml解析(字符串的xmlString)
    {
        返回新DynamicXml(XDocument.Parse(的xmlString).Root);
    }    公共静态DynamicXml负荷(字符串文件名)
    {
        返回新DynamicXml(XDocument.Load(文件名).Root);
    }    公众覆盖布尔TryGetMember(GetMemberBinder粘结剂,out对象结果)
    {
        结果= NULL;        VAR ATT = _root.Attribute(binder.Name);
        如果(ATT!= NULL)
        {
            结果= att.Value;
            返回true;
        }        VAR节点= _root.Elements(binder.Name);
        如果(nodes.Count()→1)
        {
            结果= nodes.Select(N =&gt;新建DynamicXml(N))了ToList()。
            返回true;
        }        VAR节点= _root.Element(binder.Name);
        如果(节点!= NULL)
        {
            如果(node.HasElements)
            {
                结果=新DynamicXml(节点);
            }
            其他
            {
                结果= node.Value;
            }
            返回true;
        }        返回true;
    }
}

Is it possible Deserialize unknown XML to object like below?

 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)));

解决方案

You may want to try this.

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 => new DynamicXml(n)).ToList();
            return true;
        }

        var node = _root.Element(binder.Name);
        if (node != null)
        {
            if (node.HasElements)
            {
                result = new DynamicXml(node);
            }
            else
            {
                result = node.Value;
            }
            return true;
        }

        return true;
    }
}

这篇关于反序列化XML要使用动态对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆