今まで小規模なスタンドアロンアプリケーション作ってた時は、データベースとして MDB を使ってきたんですが、簡単なマスタ程度の情報であればわざわざMDB使わなくても、XMLでできるんじゃないかと思ってやってみました。
まず、XMLの情報を DataTable として扱えるかどうかですが、これはかなり簡単にできるようです。
XMLのスキーマ(テーブル定義情報)を作って、後はデータの入ったXMLを読み込ますだけみたいですね。
XMLスキーマで、テーブル定義した例です。
<?xml version="1.0" standalone="yes"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="corporation" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="corporation">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:int" minOccurs="0" />
<xs:element name="name" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
これで、"corporation"テーブルに、"id"列(int型) と "name"列(string)があることが定義されます。
実際のデータとして保存されるXMLはこんな感じです。
<?xml version="1.0" standalone="yes"?>
<DocumentElement>
<corporation>
<id>1</id>
<name>ホゲ株式会社</name>
</corporation>
<corporation>
<id>2</id>
<name>MEC株式会社</name>
</corporation>
<corporation>
<id>3</id>
<name>常世田自動車</name>
</corporation>
</DocumentElement>
この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のスキーマはこんな感じになります。
複数のテーブルが一ファイルにまとまってますよね。
<?xml version="1.0" standalone="yes"?>
<xs:schema id="testDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="testDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="corporation">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:int" minOccurs="0" />
<xs:element name="name" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="testTbl">
<xs:complexType>
<xs:sequence>
<xs:element name="no" type="xs:int" minOccurs="0" />
<xs:element name="name" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
スキーマ作るのが面倒な場合は、一旦 DataTable や DataSet の列定義を C# なり、VB.Net なりでおこなって、それを WriteXmlSchema() してやればいいかもしれません。
参考:
ADO.NET入門記-012 (DataSetにてXMLデータを扱う