【代码积累】xml文件读取并输出
项目中用到了对xml文档的读取,做如下总结: 一、准备(1)XML文档示例 <span style="font-family:Microsoft YaHei;font-size:14px;"><Dishes> <Dish> <Name>土豆泥底披萨</Name> <Category>披萨</Category> <Comment>本店特色</Comment> <Score>4.5</Score> </Dish> <Dish> <Name>烤囊底披萨</Name> <Category>披萨</Category> <Comment>本店特色</Comment> <Score>5</Score> </Dish> <Dish> <Name>水果披萨</Name> <Category>披萨</Category> <Comment></Comment> <Score>4</Score> </Dish> <Dish> <Name>牛肉披萨</Name> <Category>披萨</Category> <Comment></Comment> <Score>5</Score> </Dish> <Dish> <Name>培根披萨</Name> <Category>披萨</Category> <Comment></Comment> <Score>4.5</Score> </Dish> </Dishes></span>该xml文档在项目中的存储位置:
(2)与XML文档所对应的Model <span style="font-family:Microsoft YaHei;font-size:14px;"> //定义Model,用于和xml文档中的节点属性匹配 - 张振华 - 2016年8月5日10:40:12 public class Dish : NotificationObject { public string Name { get; set; } public string Category { get; set; } public string Comment { get; set; } public double Score { get; set; } }</span> 二、读取操作方法一:XMLDocument (1)为了使得程序更加正规地调用读取XML文档方法,声明接口: <span style="font-family:Microsoft YaHei;font-size:14px;">public interface IDataService { List<Dish> GetAllDishes(); }</span>(2)实现接口 <span style="font-family:Microsoft YaHei;font-size:14px;"> class XmlDataService : IDataService { //读取xml文件 - 张振华 - 2016年8月5日10:11:03 public List<Dish> GetAllDishes() { //实例化实体Dish集合,用于接收数据并返回值 List<Dish> dishList = new List<Dish>(); //获取xml文件路径 string xmlFileName = System.IO.Path.Combine(Environment.CurrentDirectory,@"DataData.xml"); //加载xml文件 XDocument xDoc = XDocument.Load(xmlFileName); //按照顺序返回<Dishes>集合下<Dish>标签里的所有内容 var dishes = xDoc.Descendants("Dish"); //将xml筛选的集合里的属性与Model对象绑定 foreach (var d in dishes) { Dish dish = new Dish(); dish.Name = d.Element("Name").Value; dish.Category = d.Element("Category").Value; dish.Comment = d.Element("Comment").Value; dish.Score = double.Parse(d.Element("Score").Value); //添加到List集合 dishList.Add(dish); } return dishList; } }</span>如上方法需要"using System.Xml.Linq;",通过“ctrl + .”操作可以实现引用,其中: <span style="font-family:Microsoft YaHei;font-size:14px;">string xmlFileName = System.IO.Path.Combine(Environment.CurrentDirectory,@"DataData.xml"); //加载xml文件 XDocument xDoc = XDocument.Load(xmlFileName);</span>也可以简化写法: <span style="font-family:Microsoft YaHei;font-size:14px;">XmlDocument xDoc = new XmlDocument(); xDoc.Load(@"DataData.xml");</span> 对于XML文档里的注释,如果按照节点查询,会报错:“无法将类型为System.Xml.XmlComment“的对象强制转换为类型“System.Xml.XmlElement”,此时:在读取过程中,加上一句,就ok. settings.IgnoreComments = true;//忽略文档里面的注释
这种方法,通过XDocument的形式将xml文档中的数据读取出来,优点在于这样操作既可以读取xml文档,同时可以编辑、删除xml文档中的数据,但是缺点在于XDocument每次读取出的数据时整个xml中的所有数据。
方法二:Linq to XML 接口、实现接口类同方法一,参考GetAllDishes方法: <span style="font-family:Microsoft YaHei;font-size:14px;">public List<Dish> GetAllDishes() { XElement xe = XElement.Load(@"DataData.xml"); //解读Linq语句,查询XML文档中Dish标签下的所有元素 - 张振华 - 2016年8月6日11:17:33 IEnumerable<XElement> elements = from ele in xe.Elements("Dish") select ele; //调用xml转ModelList的方法 return ChangeDishList(elements); }</span>以上调用的ChangeDishList()方法如下: <span style="font-family:Microsoft YaHei;font-size:14px;">//xml转换ModelList的方法 - 张振华 - 2016年8月6日11:15:13 private List<Dish> ChangeDishList(IEnumerable<XElement> elements) { List<Dish> dishList = new List<Dish>(); foreach (var ele in elements) { Dish dish = new Dish(); //为dish对象属性赋值 dish.Name = ele.Element("Name").Value; dish.Category = ele.Element("Category").Value; dish.Comment = ele.Element("Comment").Value; dish.Score= double.Parse(ele.Element("Score").Value); //将dish对象添加到dishList集合当中 dishList.Add(dish); } //将xml转化为Model集合后返回 return dishList; }</span>至此,第二种读取xml中数据的方法完毕。 比较方法一和方法二,后者使用了linq语句,在查询xml文档之前就已经做了限制:"from ele in xe.Elements("Dish")select ele; "代表读取过程中,仅仅去拿<Dishes>标签下的<Dish>中的所有内容即可,对于数据量特别大的xml文档中读取部分数据,很适用;而方法一则更加使用与对数据量较小的xml文档进行读取。
三、输出如何将读取到的xml内容输出出来呢? 仅仅一句代码就搞定了: <span style="font-family:Microsoft YaHei;font-size:14px;">public void ExportXML(List<string> dishes) { System.IO.File.WriteAllLines(@"C:output.txt",dishes.ToArray()); }</span>此处,将xml中读取到的元素,在c盘新建txt文件“output.txt”,结合查出来的List集合dishes,就可以实现将xml复杂标签中的文本信息,按照自己的需求,输出为文本文档了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c# – 如何为ASP.net Core配置Entity Framework
- c# – 无法更新asp.net mvc中的cookie
- ajax – NodeJS Web App文件上传切断文件的开头
- XML和HTML的比较
- debian – 在pbuilder中使用本地依赖项
- reactjs – 在React/React Native中使用construc
- 【转】面向Flex 3开发人员的Flex 4.5和Flash Bui
- ruby-on-rails – Neo4j性能 – 计算节点 – 链表
- 使用C#在Visual Studio 2010中使用预处理程序指令
- KETTLE 从oracle将表导入mysql