[C#.NET][XML] XSD Convert XML

  • 29331
  • 0
  • 2013-08-16

[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:\

image

image

 

轉成Dataset

xsd D:\Employee.xsd /c /O:D:\

image

image

 


如何使用Dataset

轉成Dataset的檔案我們把它加到專案裡後,雙擊Employee.cs,它會出現在工具箱。

image

 

將工具箱裡的Emp加入至專案,進行資料繫結

image

image

 

設定好DataSource屬性後,Column欄位的名稱就浮現出來了,有了ADO.NET家族的東東,利用WriteXml方法就很輕易的能轉成XML檔案

image

 

利用WriteXml方法就能輕易的轉成Xml檔案

private void button1_Click(object sender, EventArgs e)
{
    DataSet ds = dataGridView1.DataSource as DataSet;
    ds.WriteXml("Employee.xml");
}

image


如何使用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();
}

image



如果不想用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");
}

這樣便輕鬆取得資料結構,接下來要怎麼應用就看個人了。

image

 

 


後記:

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

Image result for microsoft+mvp+logo