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

前端之家收集整理的这篇文章主要介绍了【代码积累】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,@"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复杂标签中的文本信息,按照自己的需求,输出为文本文档了。

猜你在找的XML相关文章