2005年08月15日

XMLデータをアクセスする方法

XML形式の電子データに色々な情報を格納し、
情報を多目的に利用したいというニーズは多いことでしょう。
XMLは、文書コンテンツ管理、デジタル出版、
ナレッジマネジメント、企業間電子商取引などの
インターネットビジネスをはじめ、
アプリケーション間インターフェイスのソリューションとして、
最近では次世代の
ビジネス基盤とし大きな期待が寄せられています。

XML(eXtensible Markup Language)は、
あなたもご存知の通り、
データを構造化し記述するためのマークアップ言語です。
データを作成するユーザーが独自に設定した
「タグ」で、特定の文字列データを囲み、
データを構造的に埋め込んでいく言語のことです。

XMLは全然難しくありません。
あなたもこの機会にXMLをマスターし、
あなたがつくるアプリケーションに応用してください。

今回紹介するサンプルプログラムは、
Delphiの「XMLDoc」「XMLIntf」ユニットを利用し、
XMLデータからXMLタグを指定しそのデータ値を取得したり、
指定したXMLタグ配下のタグ情報を取得するプログラムです。

全ソースは【続きを読む】をクリック!

使用例
procedure TForm1.btnReadClick(Sender: TObject);
 //------------------------------------------------------------------------------
 procedure Doc2View(pXMLDoc: TXMLDocument);
 var
  lCnt: Integer;
  lMsg: String;
  lXMLNode: IXMLNode;
 begin
  memXML.Clear;
  // <Root.RowData>配下の<Country>タグのデータを抽出し
  // 画面に表示する

  lXMLNode := _XMLFindNode(pXMLDoc.Node, 'Root.RowData');
  if (lXMLNode = Nil) then Exit;
  for lCnt := 0 to lXMLNode.ChildNodes.Count-1 do
  begin
   memXML.Lines.Add('Country');
   lMsg := Format(' Name="%s",Capital="%s",Population="%s"',
    [_XMLGetNodeValue(lXMLNode.ChildNodes[lCnt], 'Name'),
     _XMLGetNodeValue(lXMLNode.ChildNodes[lCnt], 'Capital'),
      _XMLGetNodeValue(
       lXMLNode.ChildNodes[lCnt], 'Population')]);
   memXML.Lines.Add(lMsg);
  end;
 end;
begin
 mXMLDocument := _XMLLoadFromFile(edtXMLFileName.Text);
 Doc2View(mXMLDocument);
end;

//------------------------------------------------------------------------------
procedure TForm1.btnGetNodeValueClick(Sender: TObject);
begin
 // 指定されたタグのデータを取得し画面に表示する
 edtValue.Text :=
  _XMLGetNodeValue(mXMLDocument.Node, edtTag.Text);
end;


【XMLデータ】

country_xml.gif

【画面イメージ】

XMLTester.gif

関連書籍


Copyright guy@かしらもんじ でぇ〜

注意:
 下記ソースファイルは、本ページの管理者である「guy」が個人的に作成しました。
 このソースは作者に断り無く、個人がコピー、改造することは許可しますが、
 いかなる場合であっても、商用目的に使用することを固く禁じます。
 あと、ホームページでの公開の都合上、各ソースの先頭に全角スペースが入ってます。
 あなたがDelphiでコンパイルする前に、この全角スペースを半角スペースに変換してくださいね。

Project File: XMLTester.dpr
program XMLTester;

uses
 Forms,
 XMLTesterUnit in 'XMLTesterUnit.pas' {Form1};

{$R *.res}

begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.


Form File: XMLTesterUnit.dfm
object Form1: TForm1
 Left = 192
 Top = 114
 BorderIcons = [biSystemMenu, biMinimize]
 BorderStyle = bsSingle
 Caption = 'XML Tester'
 ClientHeight = 200
 ClientWidth = 388
 Color = clBtnFace
 Font.Charset = SHIFTJIS_CHARSET
 Font.Color = clWindowText
 Font.Height = -12
 Font.Name = #65325#65331' '#65328#12468#12471#12483#12463
 Font.Style = []
 OldCreateOrder = False
 OnCreate = FormCreate
 OnDestroy = FormDestroy
 PixelsPerInch = 96
 TextHeight = 12
 object Label1: TLabel
  Left = 4
  Top = 8
  Width = 50
  Height = 12
  Alignment = taRightJustify
  AutoSize = False
  Caption = 'XML File:'
 end
 object Label2: TLabel
  Left = 4
  Top = 156
  Width = 50
  Height = 12
  Alignment = taRightJustify
  AutoSize = False
  Caption = 'Tag:'
 end
 object Label3: TLabel
  Left = 4
  Top = 180
  Width = 50
  Height = 12
  Alignment = taRightJustify
  AutoSize = False
  Caption = 'Value:'
 end
 object btnRead: TButton
  Left = 294
  Top = 4
  Width = 90
  Height = 20
  Caption = 'Read XML!'
  TabOrder = 1
  OnClick = btnReadClick
 end
 object edtXMLFileName: TEdit
  Left = 58
  Top = 4
  Width = 220
  Height = 20
  TabOrder = 0
  Text = '.\country.xml'
 end
 object memXML: TMemo
  Left = 4
  Top = 28
  Width = 380
  Height = 120
  TabOrder = 2
 end
 object edtTag: TEdit
  Left = 58
  Top = 152
  Width = 220
  Height = 20
  TabOrder = 3
  Text = 'Root.Information.FileName'
 end
 object btnGetNodeValue: TButton
  Left = 294
  Top = 152
  Width = 90
  Height = 20
  Caption = 'GetNodeValue'
  TabOrder = 5
  OnClick = btnGetNodeValueClick
 end
 object edtValue: TEdit
  Left = 58
  Top = 176
  Width = 220
  Height = 20
  TabOrder = 4
 end
end


Source File: XMLTesterUnit.pas
unit XMLTesterUnit;

interface

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

type
 TForm1 = class(TForm)
  Label1: TLabel;
  Label2: TLabel;
  Label3: TLabel;
  edtXMLFileName: TEdit;
  btnRead: TButton;
  memXML: TMemo;
  edtTag: TEdit;
  edtValue: TEdit;
  btnGetNodeValue: TButton;
  procedure FormCreate(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
  procedure btnReadClick(Sender: TObject);
  procedure btnGetNodeValueClick(Sender: TObject);
 private
  mXMLDocument: TXMLDocument;
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

//------------------------------------------------------------------------------
function _GetElement(const pSource: String;
 const pDelimiter: String; const pIndex: Integer = 0): String;
var
 lCnt,
 lPos,
 lLen,
 lIdx,
 lEnd: Integer;
begin
 Result := '';
 lIdx := 0;
 lCnt := 1;
 lLen := Length(pSource);
 while (lCnt <= lLen) do
 begin
  if (pIndex = lIdx) then
  begin
   lEnd := Pos(pDelimiter, Copy(pSource, lCnt, lLen-lCnt+1));
   if (lEnd = 0) then
    lEnd := lLen - lCnt + 1
   else
    lEnd := lEnd - 1;
   Result := Copy(pSource, lCnt, lEnd);
   Exit;
  end;
  lPos := Pos(pDelimiter, Copy(pSource, lCnt, lLen-lCnt+1));
  if (lPos = 0) then
   Exit;
  lCnt := lCnt + lPos + Length(pDelimiter) - 1;
  Inc(lIdx);
 end;
end;

//------------------------------------------------------------------------------
function _XMLLoadFromFile(const pFileName: String): TXMLDocument;
begin
 Result := TXMLDocument.Create(Application);
 Result.FileName := pFileName;
 Result.Active := True;
end;

//------------------------------------------------------------------------------
function _XMLFindNode(const pNode: IXMLNode; const pName: String): IXMLNode;
var
 lCnt,
 lLvl: Integer;
 lNode: IXMLNode;
 lList: IXMLNodeList;
 lName: String;
 lFind: Boolean;
begin
 Result := Nil;
 if (Trim(pName) = '') then
  Exit;
 if (not pNode.GetHasChildNodes) then
  lList := Nil
 else
  lList := pNode.ChildNodes;
 lLvl := 0;
 while True do
 begin
  lName := _GetElement(pName, '.', lLvl);
  if (lName = '') then
   Break;
  if (lList = Nil) then
  begin
   lNode := Nil;
   break;
  end;
  lFind := False;
  for lCnt := 0 to (lList.Count - 1) do
  begin
   if (lList.Nodes[lCnt].LocalName = lName) then
   begin
    lNode := lList.Nodes[lCnt];
    lFind := True;
    break;
   end;
  end;
  if (lFind = False) then
  begin
   lNode := Nil;
   break;
  end;
  if (not lNode.GetHasChildNodes) then
   lList := Nil
  else
   lList := lNode.ChildNodes;
  Inc(lLvl);
 end;
 lList := Nil;
 Result := lNode;
end;

//------------------------------------------------------------------------------
function _XMLGetNodeValue(const pNode: IXMLNode; const pName: String): String;
var
 lXMLNode: IXMLNode;
begin
 Result := '';
 if (pNode = Nil) then
  Exit;
 try
  lXMLNode := _XMLFindNode(pNode, pName);
  if lXMLNode <> Nil then
   Result := lXMLNode.Text;
 except
 end;
end;

//------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
 mXMLDocument := Nil;
end;

//------------------------------------------------------------------------------
procedure TForm1.FormDestroy(Sender: TObject);
begin
 if (mXMLDocument <> Nil) then
 begin
  mXMLDocument := Nil;
 end;
end;

//------------------------------------------------------------------------------
procedure TForm1.btnReadClick(Sender: TObject);
 //----------------------------------------------------------------------------
 procedure Doc2View(pXMLDoc: TXMLDocument);
 var
  lCnt:   Integer;
  lMsg:   String;
  lXMLNode: IXMLNode;
 begin
  memXML.Clear;
  //
  lXMLNode := _XMLFindNode(pXMLDoc.Node, 'Root.RowData');
  if (lXMLNode = Nil) then Exit;
  for lCnt := 0 to lXMLNode.ChildNodes.Count-1 do
  begin
   memXML.Lines.Add('Country');
   lMsg := Format(' Name="%s",Capital="%s",Population="%s"',
    [_XMLGetNodeValue(lXMLNode.ChildNodes[lCnt], 'Name'),
     _XMLGetNodeValue(lXMLNode.ChildNodes[lCnt], 'Capital'),
      _XMLGetNodeValue(lXMLNode.ChildNodes[lCnt], 'Population')]);
   memXML.Lines.Add(lMsg);
  end;
 end;
begin
 mXMLDocument := _XMLLoadFromFile(edtXMLFileName.Text);
 Doc2View(mXMLDocument);
end;

//------------------------------------------------------------------------------
procedure TForm1.btnGetNodeValueClick(Sender: TObject);
begin
 edtValue.Text := _XMLGetNodeValue(mXMLDocument.Node, edtTag.Text);
end;

end.


XML File: country.xml
<Root>
 <Information>
  <FileName>country.xml</FileName>
  <FileType>XML Document</FileType>
 </Information>

 <RowData>
  <Country>
   <Name>Argentina</Name>
   <Capital>Buenos Aires</Capital>
   <Population>32300003</Population>
  </Country>

  <Country>
   <Name>Bolivia</Name>
   <Capital>La Paz</Capital>
   <Population>7300000</Population>
  </Country>

  <Country>
   <Name>Brazil</Name>
   <Capital>Brasilia</Capital>
   <Population>150400000</Population>
  </Country>

  <Country>
   <Name>Canada</Name>
   <Capital>Ottawa</Capital>
   <Population>26500000</Population>
  </Country>
 </RowData>

</Root>

posted by guy at 22:29 | XML編
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。