C#读取XMLnode
关于C#读取XML的方法,一直以来都是查资料而后忘记,反复如此,历来没有记住过.今天写这篇为了总结一下.固然,时间长了必定也会忘,由于根本不想记住数据库
一.目标是这样的XML文件 1.使用状况 : 为了将一些少许的数据免去存入数据库的麻烦,因此使用了XML,因此这个XML的结构和数据库表字段一对应 例若有一个表page:有四个字段 page (table) id (主键编号) name (名字) url (地址) count (计数) 那么天然对应的XML是这样 <page id="1" name="nnn" url="uuu" count="100"></page> xml元素的名称是这个表的名称,属性对应字段名.没有INNERXML.很是清晰 整个XML文件内容可能如此 <?xml version="1.0" encoding="utf-8" ?> <rootxml> <page id="1" name="n1" url="u1" count="100"></page> <page id="2" name="n2" url="u2" count="200"></page> .....更多的记录(略) </rootxml> 看起来这个文档就对应这个表,若是有其它表,在根节点下增长元素,以表名为元素名. 2.上面的结构好像也不合理,有一个方案以下.用数据库名字做为根元素名,用表名做子节点名,用item做记录名. 依然例如这个page表,它处在数据库mydata中.那么以下: <?xml version="1.0" encoding="utf-8" ?> <mydata> <page> <item id="1" name="n1" url="u1" count="100"></item> <item id="2" name="n2" url="u2" count="200"></item> </page> .....更多的表(略) </mydata> 看起来结构更好些,能反应数据库和表的结构.若是有多个表,能够再增长节点 3.以上两种结构其实都能达到目的,只是节点层级多少不一样. 我使用第一种结构,由于不喜欢复杂层级.根节点下就是记录节点狠好.并且我但愿一个XML文档就 只包含这一个表,若是有多个表就再建多个XML文档.不但愿多表混在一个文档里. 固然,当数据量少时,使用第二种结构更好.清晰明白.
二.读取XML // 创建XMLDOCUMENT对象 XmlDocument xmldoc = new XmlDocument(); // 载入文档 xmldoc.Load(路径或流); /* 读取节点集合 第一个/,表示根目录,第二个/page,表示根目录下的page元素节点.这样和目录层级相似, 不知道目录的名字,能够直接用/,如根目录,没有指定名字. */ xmldoc.SelectNodes("//page") /* 还能够找一个符合条件的元素,好比要id属性等于1.那么就是这样.在page以后的方括号加条件 ,那么就会找到一个id=1的page元素.这很是有用.相似于查询page表,where id=1 */ xmldoc.SelectNodes("//page[@@id='1']") // 读取XML元素的属性,找到元素节点以后,读取path属性 node.Attributes["path"].Value;
三.须要了解的知识点:关于XMLELEMENT和XMLNODE 这两个类的关系是,XmlElement是子,XmlNode是父.表现出来就是XmlElement是XmlNode的一种. 即:Xml节点类型不少:属性节点、注释节点、文本节点、元素节点等,都叫XmlNode.而XmlElement指的是元素节点.
四.将XML元素转换成一个对象 C#中有序列化和反序列化能够将XML文档转为对象,或者将对象转为XML.功能强大.可是: 我目前的任务较简单,找到page元素以后,将它的属性数据转到page对象上. // page元素 <page id="1" name="nnn" url="uuu" count="100"></page> // 要转成page对象 class Page { public string Id{get;set;} public string Name{get;set;} public string Url{get;set;} public string Count{get;set;} } // 使用反射作到.前提条件是字段名和属性名对应. /* T:表示XML元素对应的类型,就是Page对象 XmlElement表示一个XML元素,就是page元素 */ public T XmlElementToT(XmlElement xmlelement) { // 建立一个实例 T tmp = System.Activator.CreateInstance(); // 循环当行数据行的全部字段 for (int i = 0; i < xmlelement.Attributes.Count; i++) { XmlAttribute currattr = xmlelement.Attributes[i]; // 使用反射找到出该字段名称相同的对象的属性 System.Reflection.PropertyInfo prop = tmp.GetType().GetProperty(currattr.Name, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase); // 若是找到了属性,则设置值.没找到则不动做(此处可能转换类型失败,请尽可能保证属性类型为string) if (prop != null) { prop.SetValue(tmp, Convert.ChangeType(currattr.Value, prop.PropertyType)); } } return tmp; }