過往的資料處理都是跟Json交手,近來第一次遇到處理XML檔的需求。
有可能是小妹太孤陋寡聞,總之這是一個資料結構高達 1x 層的XML檔(從沒看過這麼可怕的),需求只是簡單的針對該檔案做資料備份。
基於狀況上的諸多考量,本只打算將該XML檔以Excel開啟後的二維結構去做存放,不花費太多時間去處理複雜的資料結構。
中間遇到一些困難,所以研究了下一般對XML檔的處理方式,以此整理及備記。
-------------------------------------------------------------------------------------------------------------------
在C#提供處理XML的類別有XmlDocument、XDocument、XmlReader、XmlSerializer等,改日再詳究。
Convert XML into DataSet.
using System.Xml;
DataSet ds = new DataSet();
ds.ReadXml(xmlFilePath);
using System.Xml後,可以 DataSet 的 ReadXml Method 讀入Xml檔的資料,輕鬆取得DataSet格式資料.
如果Xml檔本身的資料結構包含多層,也會自動切割成多張DataTable ( 以此次 1x 層的Xml為例 ... 就會得到一個裡面有 1x 個DataTable的 DataSet ... )
對正常的需求來說,處理資料真的方便很多 !
( 只是以此次來說,不想開 1x 張資料表 ... )
ReadXml含8種多載,就不一一介紹,可參閱 Data
Convert XML to Array
- use Linq to XML
讀取XML檔內容轉為xDocument,以Linq整理成Array的格式XDocument productXML = XDocument.Parse(xmlData); var productArray = productXML.Root.Select(x => x.productName).ToArray();
- XML serialization
XmlSerializer ser = new XmlSerializer(typeof(Configuration)); using (TextReader reader = new StringReader(xmlData)) { Configuration result = (Configuration)serializer.Deserialize(reader); }
XML to Excel
找了好一陣子,好像沒有看到什麼可以簡單方便的辦法。
以下有幾種處理方式
- 將XML讀為DataSet後,自己建立Excel檔案,自行統整寫入。
- XSLT 可延伸樣式表轉換語言(Extensible Stylesheet Language Transformations)
尚未測試 - 套件Spire.Xls
using Spire.Xls; Workbook wb = new Workbook; wb.LoadFromXml(xmlFilePath); wb.SaveToFile(exelFilePath,ExcelVersion.Version2013);
如有興趣,詳細請見參考資料「Excel與XML相互轉換-C 簡單實現方案」 - 自己後來的處理方式是先用Excel開啟XML後,另存Excel檔,並不是最佳解,只是對此次狀況方便處理的解法而已。
但伺服器必須有安裝Excel,另有設定xlApp.Visible = true;時才能看到Excel。Excel.Application xlApp = new Excel.ApplicationClass(); Excel.Workbook xlWorkBook; object oMissing = System.Reflection.Missing.Value; xlWorkBook = xlApp.Workbooks.OpenXML(path, oMissing, Excel.XlXmlLoadOption.xlXmlLoadImportToList); xlWorkBook.SaveAs(excelPath); xlWorkBook.Close(); xlApp.Quit(); xlApp = null;
參考資料 :
Merge XML Dataset Datatables into one Datatable
Convert XML File to Excel File