AdaでXML

XML/Adaを使ってXMLな文章をDOMで操作できるようにしてみた。

恐らくインストールはしなくても動く。手元では一応configureのprefixをプロジェクトの場所に指定してmakeしてみた。

% tar -xzvf XmlAda-1.0.tgz
% cd xmlada-1.0
% ./configure --prefix=/home/foo/project
% make install

この方法でインストールした場合はREADMEに書かれているとおりコンパイル時にライブラリの場所を指定する必要がある。付属のスクリプトを使うと楽ちん。

% gnatmake sample `bin/xmlada-config`"

さて、ファイルを開いてDOMのDocumentオブジェクトを取得してみよう。

with Input_Sources.File;
with Sax.Readers;
with DOM.Readers;

with DOM.Core;                 use DOM.Core;
with DOM.Core.Elements;        use DOM.Core.Elements;
with DOM.Core.Documents;       use DOM.Core.Documents;
with DOM.Core.Nodes;           use DOM.Core.Nodes;
with Sax.Encodings;            use Sax.Encodings;
with Unicode.CES;              use Unicode.CES;
with Unicode.CES.Basic_8bit;   use Unicode.CES.Basic_8bit;
with DOM.Core.Texts;           use DOM.Core.Texts;

with Ada.Text_IO;              use Ada.Text_IO;

procedure Sample is
   Xml_Input : Input_Sources.File.File_Input;
   Xml_Reader : Dom.Readers.Tree_Reader;
   Xml_Document : Document;

   -- 文字列リテラルをDom_Stringに変換する関数
   function "-" (Str : String) return Byte_Sequence is
   begin
      return Sax.Encodings.From_Utf32 (Unicode.CES.Basic_8bit.To_Utf32 (Str));
   end "-";

begin
   -- sample.xmlを開いて、1度SAXを通しつつ、DOM Documentに変換
   Input_Sources.File.Open(Filename => "./sample.xml", Input => Xml_Input);
   Sax.Readers.Parse(Parser => Sax.Readers.Reader(Xml_Reader), Input => Xml_Input);
   Xml_Document := Dom.Readers.Get_Tree(Read => Xml_Reader);

   -- ルート要素のhoge属性を取得してみる
   -- ここまでくれば後はほぼいつも通り
   Put(Get_Attribute(Get_Element(Xml_Document), -"hoge")); New_Line;

   -- 閉じる
   Dom.Readers.Free(Xml_Reader);
   Input_Sources.File.Close(Xml_Input);
end Sample;

User's Guideには何も書かれていないので、素直にadsファイルを読むのが良い。ちなみに、一連のDOM Nodeはtagged recordではなくて、普通のrecordなので、Ada05でもドット記法は使えなさそう。