サイトのトップページへ リンクのページへ ロゴマーク - Delphi Programming
掲載 2010年02月05日  更新 2011年09月28日 Delphiサンプルプログラム集
921_WebAPI_REST による郵便番号と住所検索
動作確認等 Windows XP(SP3) + Delphi 2010(UP5) Pro + Indy 10.5.7
Windows XP(SP3) + Delphi XE Pro + Indy 10.5.7
Windows XP(SP3) + Delphi XE2 Pro + Indy 10.5.8.0
Windows 7 U64  + Delphi XE2 Pro VCL-32, VCL-64 + Indy 10.5.8.0
 921_WebAPI_REST_Postal.zip [4,624 KB] 2011年09月28日版(EXE同梱)
[前のページ][次のページ]



  • 2010年02月10日
  • [XMLのツリー表示2]を追加して,構成を変更
  • 2011年01月31日
  • [07]を追加
  • 2011年09月28日
  • リクエスト先のURL変更に伴う修正




01_郵便番号から住所の情報を取得 ( 前方一致 )


[920_Web API XML-RPC 郵便番号]では,Web APIを利用して郵便番号から住所を検索するテストをしました.それはXML-RPC方式を用いました.このページのコードは現在多く使用されているREST方式のサンプルプログラムです.
グローブテクノジーが提供している郵便番号検索APIを使用しています.RESTは検索APIのURLにコマンドやパラメータの文字列をGETコマンド(IndyではGETメソッド)で送ります.リクエスト結果はいろいろな方式がありますが,ここではXMLで受取ります.XMLは多くのWeb APIでサポートしています.
920のサンプル同様,TXMLDocument(XMLDoc.pas)コンポーネントを使用してXMLデータバインディングをしたpasファイルを使用しています(プロジェクトに添付しています).

このサンプルプログラムのTEditでは,NumbersOnlyプロパティの値をTrueにして,数値以外の入力を禁止していますが,このWeb APIでは'-'があっても正常に検索してくれます.


図1
設計時画面
  • TIdHTTP(Indy)コンポーネント
    TXMLDocumentコンポーネント
    を配置
  • TMemoに結果を表示
図2
完全一致検索の例
図3
前方(先頭)一致検索の例

リスト1 
郵便番号(前方一致)から住所の情報を検索
unit PostaToAddresUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, ExtCtrls, xmldom, XMLIntf, msxmldom, XMLDoc;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    XMLDocument1: TXMLDocument;
    Memo1: TMemo;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses ZipAddress;

{$R *.dfm}

//=============================================================================
//  郵便番号から住所の情報を取得(先頭一致)
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  ServiceURL : String;
  SeachStr   : String;
  GetStream  : TMemoryStream;
  AURL       : string;

  i          : Integer;
  AResultSet : IXMLGroovewebserviceType;
  Address    : IXMLAddressType;
  AOffice    : IXMLOfficeType;
  Str        : string;
begin
  if Edit1.Text = '' then begin
    ShowMessage('検索文字列が空です. ');
    exit;
  end;
  Memo1.Clear;

  Screen.Cursor := crHourGlass;

  GetStream := TMemoryStream.Create;
  try
    //リクエスト先のURL
    //以前のリクエスト先のURLは以下
    //http://groovetechnology.co.jp/ZipSearchService/v1/zipsearch
    ServiceURL := 'http://api.postalcode.jp/v1/zipsearch';
    //リクエスト内容のコマンドまたはパラメータの文字列
    SeachStr   := '?zipcode=' + Trim(Edit1.Text) +
                  '&format=xml';
    AURL       := ServiceURL + SeachStr;

    //GETで送信して結果をGetStremに取得する.リクエスト結果はXML
    try
      IdHTTP1.Get(AURL, GetStream);
    except
    end;

    //XMLをActiveにしてGetStreamからXMLに変換
    try
      XMLDocument1.Active := True;
      XMLDocument1.LoadFromStream(GetStream);
    except
    end;
  finally
    GetStream.Free;
  end;

  Memo1.Lines.BeginUpdate;

  //データセットへのアクセス
  AResultSet := Getgroovewebservice(XMLDocument1);

  if (AResultSet.Address.Count = 0) and (AResultSet.Office.Count = 0) then begin
    Memo1.Lines.Add('検索に失敗しました.');
  end else begin
    //まず事業所以外のリスト
    for i := 0 to AResultSet.Address.Count-1 do begin
      Address := AResultSet.Address[i];

      //表示用文字列を作成
      Str := Format('%7d ',  [Address.Zipcode]) +
             Address.Prefecture + ' ' +
             Address.City + ' ' +
             Address.Town;

      Memo1.Lines.Add(Str);
    end;

    //次に事業所のリスト
    //小字名,丁目,番地等と事業所名を追加
    for i := 0 to AResultSet.Office.Count-1 do begin
      AOffice := AResultSet.Office[i];

      //表示用文字列を作成
      Str := Format('%7d ',  [AOffice.Zipcode]) +
             AOffice.Prefecture + ' ' +
             AOffice.City + ' ' +
             AOffice.Town + ' ' +
             AOffice.Street + ' ' +
             AOffice.Office_name;

      Memo1.Lines.Add(Str);
    end;
  end;

  Memo1.Lines.EndUpdate;
  Screen.Cursor := crDefault;
  Edit1.SetFocus;
end;

end.

[ 頁先頭 ]



02_住所から郵便番号を検索 ( 前方一致 )


このWeb APIでは,住所から郵便番号も検索できます.そのテストプログラムです.前方(先頭)一致検索ができます.リスト1のコードと違うところは,送信するコマンドだけです.TEditは漢字も入力可能なようにImeModeをimHiraにしています.
このサンプルでは,結果の表示の体裁はほとんど考慮していません.また住所等のカナも表示していません.必要であればWeb APIの提供サイトで調べて追加してください.コード補完機能でも大方の予想はつくでしょう.


図5
設計時画面
  • TIdHTTP(Indy)コンポーネント
    TXMLDocumentコンポーネント
    を配置
  • TMemoは結果の表示用
図6
検索結果例1
図6
検索結果例2
  • [独立行政法人]の検索結果

リスト2 
サンプルプログラムのコード
リスト1と違うのはこのコードだけなので省略
    //リクエスト内容のコマンドまたはパラメータの文字列
    SeachStr   := '?word=' + HTTPEncode(Trim(Edit1.Text)) +
                  '&format=xml';

[ 頁先頭 ]



03_XML コードの整形


取得したXMLは整形されていない場合があります.もちろんXMLデータバインディング作業に影響はありませんが,表示して確認したい場合は不便です,XMLDoc.pas内のFormatXMLData関数を使用すると簡単に整形できます.そのサンプルプログラムです.


図7
設計時画面
  • TXMLDocumentコンポーネント
    TOpenDialogコンポーネント
    を配置
  • TMemoは確認用
図8
整形前
図9
整形後
  • 美人に変身(?)

リスト3 
XMLコードの整形
unit XMLCodeFomatUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, xmldom, XMLIntf, msxmldom, XMLDoc;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    XMLDocument1: TXMLDocument;
    OpenDialog1: TOpenDialog;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
    BaseDir   : String;
    ADir      : String;
    AFileName : String;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  [オリジナル]ボタン
//  整形前のXMLデータを読み込んで表示
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  if BaseDir = '' then BaseDir := ExtractFilePath(ParamStr(0));

  OpenDialog1.InitialDir := BaseDir;
  if OpenDialog1.Execute then begin
    ADir      := ExtractFilePath(OpenDialog1.FileName);
    AFileName := ExtractFileName(OpenDialog1.FileName);

    //XMLファイルを読み込む
    XMLDocument1.LoadFromFile(OpenDialog1.FileName);
    //表示
    Memo1.Text := XMLDocument1.XML.Text;
  end;
end;

//=============================================================================
//  [整形保存]
//  FormatXMLData関数で整形して保存
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  StrXML : String;
begin
  if XMLDocument1.XML.Text = '' then begin
    ShowMessage('保存するXMLテキストがありません.');
    exit;
  end;

  //整形
  StrXML := XMLDoc.FormatXMLData(XMLDocument1.XML.Text);
  //確認表示
  Memo1.Text := StrXML;

  AFileName := ADir + 'Format' + AFileName;
  XMLDocument1.XML.Text := StrXML;
  //Activeにしないとエラー
  XMLDocument1.Active := True;
  XMLDocument1.SaveToFile(AFileName);
end;

end.

[ 頁先頭 ]



04_XML のツリー表示 1


XMLをツリー表示するサンプルです.XMLそのものを整形するのも一案ですが,ツリー表示すればその構造が明確になり,見通しが良くなる場合もあります.
Node(IXMLNode)のChildNodesの数だけループし,NodeNameNodeTextを表示します.


図10
設計時画面
  • TIdHTTP(Indy)コンポーネント
    TXMLDocumentコンポーネント
    TTreeViewコンポーネント
    を配置
図11 取得結果

リスト4 
XMLのツリー表示1
unit PostaToAddresXMLTree1Unit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, ExtCtrls, xmldom, XMLIntf, msxmldom, XMLDoc;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    XMLDocument1: TXMLDocument;
    Edit1: TEdit;
    TreeView1: TTreeView;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
    procedure BuildTree(TreeNode: TTreeNode; XMLNode: IXMLNode);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  郵便番号から住所の情報を取得(先頭一致)
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  ServiceURL : String;
  SeachStr   : String;
  GetStream  : TMemoryStream;
  AURL       : string;
begin
  if Edit1.Text = '' then begin
    ShowMessage('検索文字列が空です. ');
    exit;
  end;

  Screen.Cursor := crHourGlass;

  GetStream := TMemoryStream.Create;
  try
    //リクエスト先のURL
    //以前のリクエスト先のURLは以下
    //http://groovetechnology.co.jp/ZipSearchService/v1/zipsearch
    ServiceURL := 'http://api.postalcode.jp/v1/zipsearch';
    //リクエスト内容のコマンドまたはパラメータの文字列
    SeachStr   := '?zipcode=' + Trim(Edit1.Text) +
                  '&format=xml';
    AURL       := ServiceURL + SeachStr;

    //GETで送信して結果をGetStremに取得する.リクエスト結果はXML
    try
      IdHTTP1.Get(AURL, GetStream);
    except
    end;

    //XMLをActiveにしてGetStreamからXMLDocument1に代入
    //これでリクエスト結果のXMLが取得できたことになる
    try
      XMLDocument1.LoadFromStream(GetStream);
    except
    end;
  finally
    GetStream.Free;
  end;

  TreeView1.Items.Clear;
  TreeView1.Items.BeginUpdate;
  TreeView1.AutoExpand := True;

  //ノードのツリーを構成して表示
  BuildTree(nil, XMLDocument1.DocumentElement);

  TreeView1.Items.EndUpdate;
  Screen.Cursor := crDefault;
  Edit1.SetFocus;
end;

//=============================================================================
//  ツーリー構成用の関数
//=============================================================================
procedure TForm1.BuildTree(TreeNode: TTreeNode; XMLNode: IXMLNode);
var
  Node : TTreeNode;
  i    : Integer;
begin
  if  (XMLNode.NodeType = ntText) then  begin
    Node := TreeView1.Items.AddChild(TreeNode, XMLNode.NodeValue);
    //各ノードに対する操作はNodeプロパティに対して行う
    Node.SelectedIndex := 0;
  end else begin
    Node := TreeView1.Items.AddChild(TreeNode, XMLNode.NodeName);
    Node.SelectedIndex := 1;
  end;
  //子ノードの数だけこのBuildTreeを再帰的に呼出す
  for i :=  0 to  XMLNode.ChildNodes.Count - 1  do  begin
    BuildTree(Node, XMLNode.ChildNodes.Nodes[i]);
  end;
end;

end.

[ 頁先頭 ]



05_XML のツリー表示 2


XMLをツリー表示するサンプルです.リスト4と少し表示スタイルを変更してみました.こちらの方がデータの把握がしやすいかも知れません.


図12
設計時画面
  • TIdHTTP(Indy)コンポーネント
    TXMLDocumentコンポーネント
    TTreeViewコンポーネント
    を配置
図13 取得結果

リスト5 
XMLのツリー表示2
unit PostaToAddresXMLTree2Unit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, ExtCtrls, xmldom, XMLIntf, msxmldom, XMLDoc;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    XMLDocument1: TXMLDocument;
    Edit1: TEdit;
    TreeView1: TTreeView;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
    procedure BuildTree(TreeNode: TTreeNode; XMLNode: IXMLNode);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  郵便番号から住所の情報を取得(先頭一致)
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  ServiceURL : String;
  SeachStr   : String;
  GetStream  : TMemoryStream;
  AURL       : string;
begin
  if Edit1.Text = '' then begin
    ShowMessage('検索文字列が空です. ');
    exit;
  end;

  Screen.Cursor := crHourGlass;

  GetStream := TMemoryStream.Create;
  try
    //リクエスト先のURL
    //以前のリクエスト先のURLは以下
    //http://groovetechnology.co.jp/ZipSearchService/v1/zipsearch
    ServiceURL := 'http://api.postalcode.jp/v1/zipsearch';
    //リクエスト内容のコマンドまたはパラメータの文字列
    SeachStr   := '?zipcode=' + Trim(Edit1.Text) +
                  '&format=xml';
    AURL       := ServiceURL + SeachStr;

    //GETで送信して結果をGetStremに取得する.リクエスト結果はXML
    try
      IdHTTP1.Get(AURL, GetStream);
    except
    end;

    //XMLをActiveにしてGetStreamからXMLDocument1に代入
    //これでリクエスト結果のXMLが取得できたことになる
    try
      XMLDocument1.LoadFromStream(GetStream);
    except
    end;
  finally
    GetStream.Free;
  end;

  TreeView1.Items.Clear;
  TreeView1.Items.BeginUpdate;
  TreeView1.AutoExpand := True;

  //ノードのツリーを構成して表示
  BuildTree(nil, XMLDocument1.DocumentElement);

  TreeView1.Items.EndUpdate;
  Screen.Cursor := crDefault;
  Edit1.SetFocus;
end;

//=============================================================================
//  ツーリー構成用の関数
//=============================================================================
procedure TForm1.BuildTree(TreeNode: TTreeNode; XMLNode: IXMLNode);
var
  Node     : TTreeNode;
  NodeText : String;
  AttrNode : IXMLNode;
  i        : Integer;
begin
  //テキストノードや他の特殊な場合を除く
  if not (XMLNode.NodeType = ntElement) then exit;

   //ノード追加
   NodeText := XMLNode.NodeName;
   if XMLNode.IsTextElement then begin
     NodeText := NodeText + ' = '+ XMLNode.NodeValue;
   end;
   Node := TreeView1.Items.AddChild(TreeNode, NodeText);

   //属性があれば追加
   for i := 0 to XMLNode.AttributeNodes.Count-1 do begin
     AttrNode := XMLNode.AttributeNodes.Nodes[i];
     TreeView1.Items.AddChild(Node,
        '[' + AttrNode.NodeName + ' = "' + AttrNode.Text + '"]');
   end;

  //子ノードの数だけこのBuildTreeを再帰的に呼出す
  //一応子ノードの存在を確認してから
  if XMLNode.HasChildNodes then begin
    for i :=  0 to  XMLNode.ChildNodes.Count - 1  do  begin
      BuildTree(Node, XMLNode.ChildNodes.Nodes[i]);
    end;
  end;
end;

end.

[ 頁先頭 ]



06_XML データバインディングを使用しない方法


XMLのデータバインディングをしないでもXMLのデータは取得できます.それはノードツリーを調べて,値のあるノードから該当する値を取得する方法です.XMLドキュメント操作の基本を使用したやり方ということになります.実際にはリスト5のように条件判断を入れといた方が確実です.


図14
設計時画面
  • TXMLDocumentコンポーネント
    TMemoコンポーネント
    を配置
図15 データ取得結果例

リスト6 
XMLのノードを調査してデータを取得
unit PostaToAddresNonBindingUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls, xmldom, XMLIntf, msxmldom, XMLDoc;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    XMLDocument1: TXMLDocument;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  XMLから住所情報を表示
//  XMLは前のサンプルプログラムで取得して保存したもの
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  RootNode : IXMLNode;
  ANode    : IXMLNode;
  i        : Integer;
  Str      : string;
begin
  Screen.Cursor := crHourGlass;

  //XMLファイルを読み込む
  XMLDocument1.LoadFromFile('ZipAddress.xml');

  Memo1.Clear;
  Memo1.Update;
  Memo1.Lines.BeginUpdate;

  //ルートノード
  RootNode := XMLDocument1.DocumentElement;

  for i := 0 to RootNode.ChildNodes.Count-1 do begin
    ANode := RootNode.ChildNodes[i];

    //ノード(タグ)名がaddressの場合
    if ANode.NodeName = 'address' then begin
      Str := ANode.ChildNodes['zipcode'].Text + ' ' +
             ANode.ChildNodes['prefecture'].Text +
             ANode.ChildNodes['city'].Text +
             ANode.ChildNodes['town'].Text;
      Memo1.Lines.Add(Str);
    end else
    //ノード(タグ)名がofficeの場合
    if ANode.NodeName = 'office' then begin
      Str := ANode.ChildNodes['zipcode'].Text + ' ' +
             ANode.ChildNodes['prefecture'].Text +
             ANode.ChildNodes['city'].Text +
             ANode.ChildNodes['town'].Text +
             ANode.ChildNodes['street'].Text + ' ' +
             ANode.ChildNodes['office_name'].Text;
      Memo1.Lines.Add(Str);
    end;
  end;

  Memo1.Lines.EndUpdate;
  Screen.Cursor := crDefault;
end;

end.

[ 頁先頭 ]



07_ XML マッパーを使用した方法 - DBGrid に表示


Enterprise 版以上であれば,XML Mapper (XML マッパー) という,XML マッピングツールがあります.実行ファイル名は xmlmapper.exe です.
これを利用すると,TClientDataSet,TXMLTransformProvider または TXMLTransform コンポーネントを使用して,取得した XML ファイルの内容を DBGrid に表示することができます.データバインド操作は必要ありません.
筆者が使用している Delphi は全て Pro 版なのですが,今回 Delphi 6 Enterprise 版を使用する機会がありましたので,テストしてみました.

XML Mapper で変換ファイルを作成するには,データ構造の XML ファイルか実際のデータが格納されている XML ファイルが必要です,今回は,下のサンプルコード中の,XML ファイルを保存したところで,表示のコードは実行しないでプログラムを終了し,この保存した XML ファイルを使用しました.
XML Mapper ユーティリティ,xmlmapper.exe は該当 Delphi のバージョンがインストールされている環境でないと動作しません.Delphi 6 Enterprise 版がインストールされている Windows XP (SP3) で作成しています.


図16
xmlmapper.exe 起動
  • xmlmapper.exe がマッピングツール
図17 XML ファイルを開く
  • 本テストプログラムでは, Address.xml を開いて,
  • addres[*] でマウス右クリックのメニューから [すべての子ノードを選択] をクリック
図18 ノードリスト生成
  • 選択したノードのリストが作成される
図19 パケット作成
  • 同じく address[*] のメニューから [XMLからデータパケットを作成] をクリック
図20 データ表示確認
  • [変換の作成とテスト] ボタンをクリック
  • DBGrid が表示され,そこにデータが表示される
  • データがない XML から変換する場合は,当然表示されない
図21 変換を保存
  • [ファイル] から [変換] を選択して保存.本テストでは,デフォルトの名前 ToDp.xtr で保存した


これで準備ができました.郵便番号のサイトから XML データを取得して表示します.上の手順で作成した ToDp.xtr を,テストプロジェクトのフォルダ内に保存して使用しています.


図22
設計時画面
図23 データ取得結果例

リスト7 
XML Mapper を使用て DBGrid に検索結果を表示
unit XMLMapperTestUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, ExtCtrls, DB,
  DBClient, Grids, DBGrids, Provider, Xmlxform, DBCtrls, xmldom;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    Edit1: TEdit;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    ClientDataSet1: TClientDataSet;
    XMLTransformProvider1: TXMLTransformProvider;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses HTTPApp;

{$R *.dfm}

//=============================================================================
//  テスト用に論策する住所をEdit1にセット
//=============================================================================
procedure TForm1.FormShow(Sender: TObject);
begin
  Edit1.Text := '東京都豊島区';
end;

//=============================================================================
//  住所から郵便番号を検索(先頭一致)
//
//  XMLデータの表示用に,以下のコンポーネント類を配置し,各プロパティを設定
//  あらかじめxmlmapper.exeを使用して,XMLマッピングファイル,ToDp.xtrを作成
//  xmlmapper.exeはEnterprise版以上に付属のXML Mapperユーティリティプログラム
//
//  DataSource1           : TDataSource;
//                          DataSet := ClientDataSet1;
//  ClientDataSet1        : TClientDataSet;
//                          ProviderName := XMLTransformProvider1;
//  XMLTransformProvider1 : TXMLTransformProvider;
//  DBGrid1               : TDBGrid;
//                          DataSource := DataSource1;
//
//  HTTPEncodeの使用には,usesにHTTPAppが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  AddressStr : String;
  ServiceURL : String;
  SeachStr   : String;
  AURL       : String;
  GetStream  : TMemoryStream;
begin
  if Edit1.Text = '' then begin
    ShowMessage('検索文字列が空です. ');
    exit;
  end;

  Screen.Cursor := crHourGlass;
  GetStream     := TMemoryStream.Create;
  try
    //リクエスト先のURL
    //以前のリクエスト先のURLは以下
    //http://groovetechnology.co.jp/ZipSearchService/v1/zipsearch
    ServiceURL := 'http://api.postalcode.jp/v1/zipsearch';

    //リクエスト内容のコマンドまたはパラメータの文字列
    AddressStr := HTTPEncode(Trim(Edit1.Text));
    SeachStr   := '?word=' + AddressStr + '&format=xml';
    AURL       := ServiceURL + SeachStr;

    //GETで送信して結果をGetStremに取得する.リクエスト結果はXML
    try
      IdHTTP1.Get(AURL, GetStream);
      //取得したXMLをファイルに保存
      GetStream.SaveToFile('Address.xml');
    except
      Screen.Cursor := crDefault;
      ShowMessage('検索に失敗しました.');
      exit;
    end;
  finally
    GetStream.Free;
    Screen.Cursor := crDefault;
  end;

  //保存したXMLファイルを読み出してDBGridに表示
  ClientDataSet1.Active := False;
  XMLTransformProvider1.XMLDataFile := 'Address.xml';
  XMLTransformProvider1.TransformRead.TransformationFile := 'ToDp.xtr';
  ClientDataSet1.Active := True;

  //オンラインヘルプのTXMLTransformを使用した以下のコードでも表示可能
  //XMLTransform1.SourceXMLFile := 'Address.xml';
  //XMLTransform1.TransformationFile := 'ToDp.xtr';
  //ClientDataSet1.XMLData := XMLTransform1.Data;

  Edit1.SetFocus;
end;

end.




[ 頁先頭 ] [前のページ][次のページ]