使用ExpandoObject将XML转换为动态对象
目录
介绍
*更新
*更新2
编码
XML示例
用法
注意
介绍
我开始在Internet上寻找一种简单的方法来加载XML文件并将其即时转换为对象。我的目标是为正在处理的Web项目以XML格式动态加载设置文件。
由于XML模式的定义在每个设置中都非常不同,因此我想到了使用dynamic关键字加载XML文档并将其作为简单对象进行访问。浏览后,我发现了一些使用的示例ExpandoObject。不幸的是,他们都写关于将对象转换为XML的方法,或者如何使用XML-to-LINQ映射特定的动态类/对象。
因此,我最终编写了一个小的递归方法,该方法可加载XML文档并将其转换为简单对象。
*更新
我注意到,即使3年后,人们仍然发现此技巧有用。
我认为共享一个小的更新将是一个好主意,这样就不需要使用特殊的类型属性来确定子节点是否是集合的一部分。
我突然意识到,我在Entity Framework中如此讨厌和恐惧的功能很可能就是我想要的解决方案,从而消除了用type = list属性装饰节点的需要。
我正在谈论的功能是多元化。在EF中,我们拥有一个模型,该模型的类名为Course,该类在名为Courses的数据库表中自动更改。谷歌搜索后,我遇到了以下小宝石:
- System.Data.Entity.Design.PluralizationServices
它允许将string复数或单数化。然后,我认为这很适合确定子元素是否是集合的一部分,因为父节点名称通常(如果不是始终)是其子名称的复数形式。
无论如何,我已经更改了逻辑,该逻辑将确定如果节点具有满足以下条件的子元素,则该节点是否为容器项目:
- 该项目具有1个子元素,其节点名称是其父名称的单数形式,或者
- 该项目具有多个子元素,但是子节点名称必须全部相同。
我相信这将涵盖大多数情况,并且不需要任何特殊的type = list属性。
*更新2
我不敢相信我们现在已经6年了,本文仍在使用中。
本周,我正在为自己编写的产品Feed解析器更新一些代码,实际上我有一些时间来更新此功能。
首先,它是现在的.NET Standard,因此可以在.NET Framework 4.5和更高版本以及.NET Core中使用。
我认为新方法在多种情况下也非常有用。
好吧,我希望人们会发现它有用。
编码
private dynamic GetAnonymousType(string xml, XElement element = null)
{// either set the element directly or parse XML from the xml parameter.element = string.IsNullOrEmpty(xml) ? element : XDocument.Parse(xml).Root;// if there's no element than there's no point to continueif (element == null) return null;IDictionary<string, dynamic> result = new ExpandoObject();// grab any attributes and add as propertieselement.Attributes().AsParallel().ForAll(attribute => result[attribute.Name.LocalName] = attribute.Value);// check if there are any child elements.if (!element.HasElements) {// check if the current element has some value and add it as a propertyif (!string.IsNullOrWhiteSpace(element.Value))result[element.Name.LocalName] = element.Value;return result;}// Check if the child elements are part of a collection (array). If they are not then// they are either a property of complex type or a property with simple typevar isCollection = (element.Elements().Count() > 1&& element.Elements().All(e => e.Name.LocalName.ToLower() == element.Elements().First().Name.LocalName.ToLower())// the pluralizer is needed in a scenario where you have // 1 child item and you still want to treat it as an array.// If this is not important than you can remove the last part // of the if clause which should speed up this method considerably.|| element.Name.LocalName.ToLower() == new Pluralize.NET.Core.Pluralizer().Pluralize(element.Elements().First().Name.LocalName).ToLower());var values = new ConcurrentBag<dynamic>();// check each child elementelement.Elements().ToList().AsParallel().ForAll(i =>{// if it's part of a collection then add the collection items to a temp variable if (isCollection) values.Add(GetAnonymousType(null, i));else// if it's not a collection, but it has child elements// then it's either a complex property or a simple propertyif (i.HasElements)// create a property with the current child elements name // and process its propertiesresult[i.Name.LocalName] = GetAnonymousType(null, i);else// create a property and just add the valueresult[i.Name.LocalName] = i.Value; });// for collection items we want skip creating a property with the child item names, // but directly add the child properties to theif (values.Count > 0) result[element.Name.LocalName] = values;// return the properties of the processed elementreturn result;
}
XML示例
<?xml version="1.0"?><License><RegisteredUser>Remco Reitsma</RegisteredUser><Company>Xtraworks.com</Company><Sites><Site><Host>xtraworks.com</Host><ExpireDate>15/12/2099</ExpireDate></Site><Site><Host>test.com</Host><ExpireDate>15/12/2099</ExpireDate></Site></Sites><Modules><Module><Name>SEO Package</Name><Controller>SEO</Controller><Version>0.0.1</Version><Tables><Table><Name>SEO_Site</Name></Table><Table><Name>SEO_Pages</Name></Table></Tables></Module></Modules>
</License>
用法
dynamic license = GetAnonymousType(xmlString);// Getting the values from the dynamic object is really easy now.
var registeredUser = license.RegisteredUser;
var companyName = license.Company;// Getting a collection is just as easy as it simply returns a list
var sites = license.Sites;
foreach(var site in sites)
{var host = site.Host;
}// I am sure it's easy enough for you guys to extrapolate from this simple example.
注意
要实现的重要一件事是,这是一个非常简单的示例,绝不是万无一失的。如果您可以控制提供的XML文件,那么该代码将很有用。另外,使用dynamic时会产生一些性能问题,因为它在内部需要在运行时进行大量反射,并且您还将在编译期间失去对动态对象的错误检查的机会。
例如,读入配置文件或产品简单列表可能很有用。
使用ExpandoObject将XML转换为动态对象相关推荐
- XStream将XML转换为JAVA对象快速指南
XStream是一套简单实用的JAVA类库,它用于序列化对象和XML对象之间互相转换.由于XStream配置简单,灵活易用,因此在XML对象和JAVA对象序列化市场上有很大的空间.本文并不会对XStr ...
- com.thoughtworks.xstream.converters.reflection.ReflectionConverter,用XSTream将xml转换为Java对象
将XML文件转换为object对象 XML包含:有对custs下标签含有: Java对象: @XStreamAlias("bcc:CustProperty") private Li ...
- digester java_利用Digester把XML转换为Java对象
在一个比较完整的应用系统里,经常需要有一些配置文件.简单的属性使用.properties文件即可,但要配置一些复杂对象,则应该考虑使用xml文件.一般用来读取xml文件的工具包有DOM.SAX和JDO ...
- xml字符串转换为json对象
前段时间在做一个生活缴费项目,需要调用一个第三方缴费平台的接口,这个平台是基于http请求,但是返回的内容是xml字符串.当时是想把xml字符串直接转换为对象,但是各个接口返回的内容都不同,无法转换为 ...
- java 字符串转dom对象_xml类型的字符串转换为Dom对象
我写这篇博客的目的是因为我在这一点转换方面耽搁了快2天时间,真是惭愧呀,dom4j.jar包有自带方法DocumentHelper.parseText(String text)用于将字符串类型的xml ...
- 使用XStream将JSON转换为XML到Java对象
XStream库可以是将JSON从Java转换为XML来回转换的有效工具. 让我们逐一探究它们中的每一个,并查看使用了哪个驱动程序. 处理JSON 要将JSON转换为Java对象,您要做的就是使用适当 ...
- SpringBoot接收Xml格式参数并转换为POJO对象
SpringBoot接收Xml格式参数并转换为POJO对象 1. 所需JavaBean @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder ...
- Hibernate三种状态;query查询;ResultTransformer转换为pojo对象;可以将query语句写在xml中;Criteria查询;ProjectionList总和/f分组等函数
Session操作过程中的pojo对象存在三种状态: 1) 瞬时态:该对象在数据库中没有对应的数据 2) 持久态:数据库中存在该对象对应的数据,同时操作该对象的Session也存在. 3) 游离 ...
- 使用jQuery将表单数据转换为JavaScript对象
如何将表单的所有元素转换为JavaScript对象? 我希望有一些方法可以自动从表单中构建JavaScript对象,而不必遍历每个元素. 我不需要$('#formid').serialize();返回 ...
最新文章
- Linux ISCSI配置
- Nginx 配置清单(一篇够用)
- 周志华教授:如何做研究与写论文?(附完整的PPT全文)
- 陶哲轩实分析习题 12.1.3
- boost::geometry::srs::spar用法的测试程序
- 对数几率回归 —— Logistic Regression
- myeclipse+git pull项目报错
- 用python自制背单词程序_c++自制背单词应用
- python工资高还是java-未来Java、大数据、Python哪个前景更好,薪资更高?
- Html 小插件4 百度搜索代码
- [转载]JAVA操作符
- 问题-[致命错误] Project1.dpr(1): Unit not found: 'System.pas' or binary equivalents (DCU,DPU)
- 安装福昕高级PDF编辑器提示安装错误解决办法
- 计算机科学与技术导论结课报告,计算机科学与技术导论课程报告.doc
- java中dao_java中的Dao类是什么意思?
- [精简]托福核心词汇60
- 必备配色攻略-绿色篇
- 支付宝小程序访问浙里办应用,提示页面访问受限,IOS无法访问
- Spring IOC 学习总结
- html5中css新增的属性,css3有哪些新增属性?常用的新增属性总结
热门文章
- python 仅保留数字_Python基本语法元素 | 语法元素分析
- python中if的输入格式_Python基础之输出格式和If判断
- 商用台式电脑配置_装机不求人,10分钟电脑配置挑选速成攻略
- win2008r2 mysql 远程_SQL SERVER 2008 R2如何开启数据库的远程连接(转)
- github 码云 获取_开发记录篇使用VS2019管理github项目
- aws s3 獲取所有文件_前端上传文件到Aws S3文件服务器
- 极具设计感的专辑分类设计,给你带来不一样的灵感
- 防护疫情防御插画|后疫情时代宣传不可小觑
- C++ log日志类实现
- WindowsAPI中W和A的区别