---------- 20181129 xsd ref: https://dotblogs.com.tw/yc421206/2011/03/07/21710 [C#.NET][XML] XSD Convert XML XSD檔案是負責描述XML結構的東西,裡面存放了一些資訊,比如欄位的資料型態,我們可以用XSD來驗証XML是否符合規則,SDK底下有個工具xsd.exe 專門用來處理*.xsd檔案,路徑在 x64:C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin x86:C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin 假設今天我只拿到了一個XSD檔案,我一個念頭閃過就是將它欄位取出,但要怎麼取?本篇將使用xsd.exe template for required strings template for optional strings 轉成Class xsd D:\Employee.xsd /c /O:D:\ 轉成Dataset xsd D:\Employee.xsd /c /O:D:\ 如何使用Dataset 轉成Dataset的檔案我們把它加到專案裡後,雙擊Employee.cs,它會出現在工具箱。 將工具箱裡的Emp加入至專案,進行資料繫結 設定好DataSource屬性後,Column欄位的名稱就浮現出來了,有了ADO.NET家族的東東,利用WriteXml方法就很輕易的能轉成XML檔案 利用WriteXml方法就能輕易的轉成Xml檔案 private void button1_Click(object sender, EventArgs e) { DataSet ds = dataGridView1.DataSource as DataSet; ds.WriteXml("Employee.xml"); } 如何使用Class 同樣的將轉好的Employee.cs加入至專案內,然後引用它們。[ADO.NET] 類別(Data Transfer Object )與資料繫結 private void Form1_Load(object sender, EventArgs e) { Emp emp = new Emp(); EmpInfo info = new EmpInfo(); info.Code = "1"; info.FirstName = "余"; info.LastName = "咬章魚"; info.Destination = "台北" emp.EmpInfo = info; BindingList list = new BindingList(); list.Add(info); this.dataGridView1.DataSource = list; } 然後再將類別序列化,輕而易舉的就轉成Xml了。 private void button1_Click(object sender, EventArgs e) { XmlSerializer xml = new XmlSerializer(this._Emp.GetType()); Stream stream = new FileStream("Employee1.xml", FileMode.Create, FileAccess.Write, FileShare.None); xml.Serialize(stream, this._Emp); stream.Close(); } 如果不想用Xsd.exe,直接利用Datatable或Dataset的ReadXml將XSD讀入也是不錯的一招: private void button1_Click(object sender, EventArgs e) { DataSet ds = new DataSet(); ds.ReadXml("Employee.xsd"); foreach (DataTable table in ds.Tables) { Debug.WriteLine(table.TableName); } DataTable t = new DataTable("EmpInfo"); t.ReadXml("Employee.xsd"); } 這樣便輕鬆取得資料結構,接下來要怎麼應用就看個人了。 後記: Class在處理這些資料時都是相當的方便阿,這是基本的用法千萬別忘記阿,附帶一提,小的在處理XSD遇到一個問題,這是一個無法轉檔的問題,貼出連結提供給將來碰到問題的捧油解決之道。 可能是我拿到的xsd檔本身就有問題,朱大與阿尼都指出是XSD檔結構的問題,並非指令下達錯誤。 http://social.msdn.microsoft.com/Forums/zh-TW/239/thread/8e62987a-1e67-4feb-8856-ee801ee2baa2/ 若有謬誤,煩請告知,新手發帖請多包涵