rksoftware

Visual Studio とか C# とかが好きです

DataTable で XML を使う

.NET の System.Data.DataTable。みんな大好きですよね?
実はあまり知られていない事実ですが、DataTable は XML を扱えます。

using System.Data;

// 中身を XML ファイルに出力
{
    var dt = new DataTable();
    dt.TableName = "saitama";
    dt.Columns.Add("no");
    dt.Columns.Add("name");
    dt.Rows.Add(new object[] { 1, "せんべい" });
    dt.Rows.Add(new object[] { 2, "ねぎ" });
    dt.WriteXmlSchema("schema.xml");
    dt.WriteXml("data.xml");
}

// XML ファイルから読み込み
{
    var dt = new DataTable();
    dt.ReadXmlSchema("schema.xml");
    dt.ReadXml("data.xml");
    System.Console.WriteLine($"TebleName:{dt.TableName}");
    foreach (var row in dt.AsEnumerable())
    {
        foreach (DataColumn column in dt.Columns)
            System.Console.Write($"{column.ColumnName}:{row[column.ColumnName]} ");
        System.Console.WriteLine();
    }
}

実行結果

コンソール出力

TebleName:saitama
no:1 name:せんべい
no:2 name:ねぎ

schema.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="saitama" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="saitama">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="no" type="xs:string" 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>

data.xml

<?xml version="1.0" standalone="yes"?>
<DocumentElement>
  <saitama>
    <no>1</no>
    <name>せんべい</name>
  </saitama>
  <saitama>
    <no>2</no>
    <name>ねぎ</name>
  </saitama>
</DocumentElement>

作り捨てアプリであれば意外に便利に使えたりします。
しかし役に立つ機会はあまりないかもしれないので、誰かに「できる」と言われたときに「できない」と主張してしまわない程度に覚えておきましょう。