xml对象转换成Dictionary或者list
发布时间:2020-12-16 06:11:10 所属栏目:百科 来源:网络整理
导读:对于xml对象有时候要转换成字典对象更容易读取和操作,而字典对象有个问题,就是不能有重复的键,所以对于这种情况就用list来代替,以下为代码 /// summary /// xml文档对象转换到Dictionarystring,object或list /// 拥有重复名称子节点的节点会被转换成list
对于xml对象有时候要转换成字典对象更容易读取和操作,而字典对象有个问题,就是不能有重复的键,所以对于这种情况就用list来代替,以下为代码 /// <summary> /// xml文档对象转换到Dictionary<string,object>或list /// 拥有重复名称子节点的节点会被转换成list,而忽略子节点的名称 /// </summary> /// <param name="xml_doc">xml文档对象</param> /// <param name="dso">保存Dictionary的对象</param> public static void XmlToDictionaryOrList( XmlDocument xml_doc,object dso ) { if( xml_doc == null || xml_doc.DocumentElement == null || dso == null ) { return; } XmlToDictionaryOrListWithOutAttributes( xml_doc.DocumentElement,dso ); } /// <summary> /// 转换当前节点为字典或list /// </summary> /// <param name="xn"></param> /// <param name="dso"></param> private static void XmlToDictionaryOrListWithOutAttributes( XmlNode xn,object dso ) { XmlNodeList xnl = xn.ChildNodes; List<object> list = null; Dictionary<string,object> dic = null; if( dso is Dictionary<string,object> ) { dic = dso as Dictionary<string,object>; } else { list = dso as List<object>; } object temp = null; // 如果没有子节点了,退出递归的条件 // 后一个条件是为了忽略xml的强制数据条件<![CDATA[...]]>,不把它当作子节点处理 if( xnl.Count == 0 || xn.InnerText == xn.InnerXml ) { //如果本节点是字典类型 if( dic != null ) { // 添加键值对 dic.Add( xn.Name,xn.InnerText ); } // 如果本节点是list类型,直接添加值,忽略键 else if( list != null ) { list.Add( xn.InnerText ); } else { throw new Exception( "转换失败" ); } return; } else { // 如果有重复的子节点 if( XmlNodeHasDuplicateChild( xn ) ) { // 装子节点的对象为list temp = new List<object>(); } else { temp = new Dictionary<string,object>(); } if( dic != null ) { // 以空字典添加节点 dic.Add( xn.Name,temp ); } else if( list != null ) { list.Add( temp ); } else { throw new Exception( "转换失败" ); } } // 子节点递归 for( int i = 0; i < xnl.Count; i++ ) { XmlToDictionaryOrListWithOutAttributes( xnl[i],temp ); } } /// <summary> /// XmlNode下有无重复子节点 /// </summary> /// <param name="xn"></param> /// <returns></returns> public static bool XmlNodeHasDuplicateChild( XmlNode xn ) { Dictionary<string,string> temp = new Dictionary<string,string>(); for( int i = 0; i < xn.ChildNodes.Count; i++ ) { if( temp.ContainsKey( xn.ChildNodes[i].Name ) ) { return true; } temp[xn.ChildNodes[i].Name] = "呵呵"; } return false; }
欢迎指正,希望对大家有用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- c# – 如何为电子邮件(System.Net.Mail.SmtpClient)附件设置
- c# – 如何在ASP .NET中的configureServices函数中获取连接
- JSF f:事件preRenderView是由f:ajax调用和部分渲染触发的
- c# – Task.Run与直接异步调用,用于启动长时间运行的异步方
- react-native – 如何在TabNavigator中隐藏TabBar文本?
- oracle11g 修改密码后登录的TNS-12535: TNS:operation time
- ruby-on-rails – IAP后端最佳实践
- ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法
- 分析Cocos2d-x横版ACT手游源代码 6、创建忍队界面
- ruby-on-rails – Rails有很多错误