人気ブログランキング | 話題のタグを見る
(.Net)DataTableとXMLの連携
今まで小規模なスタンドアロンアプリケーション作ってた時は、データベースとして 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データを扱う
by jehoshaphat | 2010-06-07 08:54 | .Net開発


<< (.Net,OpenOffic... (.Net)DataTable... >>