[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
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="Emp">
<xs:complexType>
<xs:sequence>
<xs:element name="EmpInfo" type="EmpInfo"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="EmpInfo">
<xs:sequence>
<xs:element name="Code" type="requiredString"/>
<xs:element name="FirstName" type="requiredString"/>
<xs:element name="LastName" type="requiredString"/>
<xs:element name="Destination" type="requiredString"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="requiredString">
<xs:annotation>
<xs:documentation>template for required strings</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="optionalString">
<xs:annotation>
<xs:documentation>template for optional strings</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:minLength value="0"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
轉成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<EmpInfo> list = new BindingList<EmpInfo>();
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/
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET