您的位置:首页 > 编程语言

【代码积累】xml文件读取并输出

2016-08-06 11:33 309 查看
      项目中用到了对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复杂标签中的文本信息,按照自己的需求,输出为文本文档了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: