【程式碼積累】xml檔案讀取並輸出
阿新 • • 發佈:2019-01-23
專案中用到了對xml文件的讀取,做如下總結:
一、準備
(1)XML文件示例
該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>
(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)實現介面如上方法需要"using System.Xml.Linq;",通過“ctrl + .”操作可以實現引用,其中:<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>
<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複雜標籤中的文字資訊,按照自己的需求,輸出為文字文件了。