项目中用到了对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,@"Data\Data.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,@"Data\Data.xml"); //加载xml文件 XDocument xDoc = XDocument.Load(xmlFileName);</span>也可以简化写法:
<span style="font-family:Microsoft YaHei;font-size:14px;">XmlDocument xDoc = new XmlDocument(); xDoc.Load(@"Data\Data.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(@"Data\Data.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文档进行读取。
三、输出
仅仅一句代码就搞定了:
<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复杂标签中的文本信息,按照自己的需求,输出为文本文档了。