【代码积累】xml文件读取并输出
2016-08-06 11:33
309 查看
项目中用到了对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>
(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;">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.
这种方法,通过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复杂标签中的文本信息,按照自己的需求,输出为文本文档了。
一、准备
(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文档进行读取。
三、输出
如何将读取到的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复杂标签中的文本信息,按照自己的需求,输出为文本文档了。
相关文章推荐
- SpringMVC入门案例
- PHP程序设计读书笔记三
- 量化分析师的Python日记【第3天:一大波金融Library来袭之numpy篇】
- golang语言中map的初始化及使用
- 基于C++的WebService开发库gsoap
- 继续树莓派GPIO:两片74HC595控制一个8x8LED点阵显示爱心
- [PHP] 自动加载的实现
- 基于C++WebService开发库—gsoap
- [JDBC]Eclipse连接MySQL数据库(傻瓜篇)
- C#测试web服务是否可用(转)
- Maven的安装和在Eclipse中配置Maven
- Yii2增删改查-查询 find
- Google Maps基础及实例解析
- 分布式队列编程模型、实战
- Java8对读写锁的改进:StampedLock
- MyEclipse2016 ci3版本破解激活(备忘录)
- python学习之路-13
- php 序列化对象 - 在会话中存放对象
- Yii2增删改查-查询 where参数详细介绍
- 006——struts2中的result配置