3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(.Net)DataTableとXMLの連携

今まで小規模なスタンドアロンアプリケーション作ってた時は、データベースとして MDB を使ってきたんですが、簡単なマスタ程度の情報であればわざわざMDB使わなくても、XMLでできるんじゃないかと思ってやってみました。

まず、XMLの情報を DataTable として扱えるかどうかですが、これはかなり簡単にできるようです。

XMLスキーマ(テーブル定義情報)を作って、後はデータの入ったXMLを読み込ますだけみたいですね。

XMLスキーマで、テーブル定義した例です。

 version="1.0" standalone="yes"?>

id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="corporation" msdata:UseCurrentLocale="true">

>

minOccurs="0" maxOccurs="unbounded">

name="corporation">

>

>

name="id" type="xs:int" minOccurs="0" />

name="name" type="xs:string" minOccurs="0" />

>

>

>

>

>

>

>

これで、"corporation"テーブルに、"id"列(int型) と "name"列(string)があることが定義されます。

実際のデータとして保存されるXMLはこんな感じです。

 version="1.0" standalone="yes"?>

>

>

>1>

>ホゲ株式会社>

>

>

>2>

>MEC株式会社>

>

>

>3>

>常世田自動車>

>

>

このXMLを読み込むときは下記のように、まずスキーマを読み込んで、後データが入ってるXMLを読み込めばいいようです。

DataTable tbl = new DataTable();

tbl.ReadXmlSchema(@"C:\schema.xml");

tbl.ReadXml(@"C:\test.xml");

DataTable.ReadXmlSchema() でスキーマを読み込み、DataTable.ReadXml() でデータを読み込むという感じですね。

出力するときも、 DataTable.WriteXmlSchema() と DataTable.WriteXml() のメソッド使えば簡単にできるようです。

DataTable だけでなく、DataSet クラスにも ReadXmlSchema() , ReadXml() , WriteXmlSchema() , WriteXml() メソッドはあるので、複数のテーブルを扱う場合は、こっちを使った方が楽ですね。

この場合、DataSet で一つのXMLファイルになります。

ちなみに、DataSetのスキーマはこんな感じになります。

複数のテーブルが一ファイルにまとまってますよね。

 version="1.0" standalone="yes"?>

id="testDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

name="testDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">

>

minOccurs="0" maxOccurs="unbounded">

 

name="corporation">

>

>

name="id" type="xs:int" minOccurs="0" />

name="name" type="xs:string" minOccurs="0" />

>

>

>

 

name="testTbl">

>

>

name="no" type="xs:int" minOccurs="0" />

name="name" type="xs:string" minOccurs="0" />

>

>

>

 

>

>

>

>

スキーマ作るのが面倒な場合は、一旦 DataTable や DataSet の列定義を C# なり、VB.Net なりでおこなって、それを WriteXmlSchema() してやればいいかもしれません。

参考:

ADO.NET入門記-012 (DataSetにてXMLデータを扱う