この記事は旧ブログ(amuns:blog)の記事です。

DelphiでXMLを読み書きするサンプルを作りました。

環境

•Turbo Delphi

サンプル

まず新規でプロジェクトを作成します。
ボタンを二つとメモを一つ張ります。メモに入力された値をXMLに出力します。

xml_01

今回はメモの内容を単にXMLに保存するのではなく、一行ずつ保存してみます。
(XMLに複数レコードを追加するのが目的)

XMLサンプル仕様

今回は以下のようなXMLを読み書きします。

<?xml version="1.0" encoding="Shift_JIS"?>
<root>
  <rs>
    <id>0</id>
    <memo1>データ1</memo1>
  </rs>
  <rs>
    <id>1</id>
    <memo1>データ2</memo1>
  </rs>
  <rs>
    <id>2</id>
    <memo1>データ3</memo1>
  </rs>
</root>

コーディング

まずusesに以下を追加します。

uses XMLIntf, XMLDoc;

次にButton1(XML書き込みボタン)の処理です。
XMLを書く処理を記述します。
メモの内容をtest.xmlに出力します(一行ごと)

procedure TForm1.Button1Click(Sender: TObject);
var
  XML_Doc   : TXMLDocument;
  XML_rs    : IXMLNode;
  XML_data  : IXMLNode;
  i         : Integer;
begin

  // XML書き込み処理
  XML_Doc := TXMLDocument.Create(nil);
  // 出力時にインデント
  XML_Doc.Options := [doNodeAutoIndent];
  XML_Doc.Active  := True;

  // 今回はShift_JISで出力
  XML_Doc.Encoding := 'Shift_JIS';
  XML_Doc.Version  := '1.0';

  // ルート
  XML_Doc.AddChild('root');

  for i := 0 to Memo1.Lines.Count-1 do begin

    // 1レコード
    XML_rs := XML_Doc.DocumentElement.AddChild('rs');

    // ID(今回は未使用だが一応)
    XML_data := XML_rs.AddChild('id');
    XML_data.NodeValue := IntToStr(i);

    // データ
    XML_data := XML_rs.AddChild('memo1');
    XML_data.NodeValue := Memo1.Lines.Strings[i];

  end;

  // 保存
  XML_Doc.SaveToFile( 'test.xml' );

end;

次にButton2(読み込みボタン)の処理です。
test.xmlから読み込んでメモに表示します。

procedure TForm1.Button2Click(Sender: TObject);
var
  XML_Doc  : IXMLDocument;
  i, j     : Integer;
begin

  // 存在チェック
  if FileExists( 'test.xml' ) then begin

    Memo1.Clear;

    // XMLを読み込み
    XML_Doc := LoadXMLDocument( 'test.xml' );

    // rsタグのループ
    for i :=  0 to  XML_Doc.DocumentElement.ChildNodes.Count - 1  do  begin

      // 子ノードのループ
      for j :=  0 to  XML_Doc.DocumentElement.ChildNodes.Nodes[i].ChildNodes.Count - 1  do  begin

        // 該当のタグか?
        if XML_Doc.DocumentElement.ChildNodes.Nodes[i].ChildNodes.Nodes[j].NodeName = 'memo1' then begin

          // 空白の場合はNULLが返されるのでチェック
          if XML_Doc.DocumentElement.ChildNodes.Nodes[i].ChildNodes.Nodes[j].NodeValue <> Null then begin

            // 値を追加
            Memo1.Lines.Add(XML_Doc.DocumentElement.ChildNodes.Nodes[i].ChildNodes.Nodes[j].NodeValue);

          end else begin

            // 空白を追加
            Memo1.Lines.Add('');

          end;

        end;

      end;

    end;

  end;

end;

実装が完了しました。それでは動かしてみましょう!

メモに複数行値を入力します。
その後XML書き込みボタンを押します。

一度アプリを終了し、XML読み込みボタンを押すと先ほど入力したデータが読み込まれます。

以上XML読み書きのサンプルでした。
XMLには設定情報やデータなどを保存すると便利ですね。