1. 程式人生 > >【程式碼積累】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複雜標籤中的文字資訊,按照自己的需求,輸出為文字文件了。