反序列化XML要使用动态对象 [英] Deserialize XML To Object using Dynamic
本文介绍了反序列化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屋!
查看全文