パーソナルツール
現在の場所: ホーム ブログ Categories dbMAGIC
« 2017September »
Su Mo Tu We Th Fr Sa
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
このBlogについて
 代表の向井田ことMUKAです。当ブログサイトでは、MAGICやDB2に関する技術者向け情報を公開しています。お気軽にお立ち寄り下さい。
最近のエントリ
twitter / 新RT機能を英語モードで・・・ muka 2009年11月19日
twitter / List Widget muka 2009年11月03日
twitter API / Retweet の仕様が・・・ muka 2009年10月30日
twitter API / Lists muka 2009年10月24日
IBM Rational Software Conference 2009 と アジャイル開発 muka 2009年10月08日
twitter API / geoタグ! muka 2009年10月01日
Twitter Developers Meetup in Tokyo muka 2009年09月11日
Club DB2 2009/9/4 muka 2009年09月05日
最近のコメント
Re:Club DB2 2009/8/29 muka 2009年09月01日
Re:Club DB2 2009/8/29 SIM 2009年08月31日
最近のトラックバック
Club DB2 8/29の感想エントリと今後の予定 Unofficial DB2 BLOG 2009年09月01日
カテゴリ
misc (47)
dbMAGIC (47)
DB2 (47)
mail (47)
Web (47)
twitter (47)
 

dbMAGIC

一つ上に移動
dbMAGIC ( MAGIC SOFTWARE JAPANの開発ツール ) に関する話題等

MAGICでRSSを読む

 なんか最近、RSS付いてまして、新しくリリース予定のプログラムに「RSSを読み込む機能を付けたら便利かな?」なんて考え、ちょっとプログラムしてみました。下がその画面です。


magic_rss.jpg


 MAGICでRSSを読むには、Blob項目を「HTTPGet (url,head...)」で更新し、それをXMLダイレクトアクセスで処理すればOKです。(実際はBlobを更にファイルに出力してそれを指定したんですけど、「項目」でも読めたような気もする・・・。けど、うまくいかなかった・・・。)
 urlは自分のサイトのRSS2.0のファイル(http://www.eternaldesign.jp/index.xml)で、今のところここしか読まないのですが、RSSの書式は共通ですから、ひとつ共通プログラムを作っておけばどんなサイトでも取得できますね。(RSSリーダーが出来る)

 さて、実際の読み方ですけど、チャンネルの情報(タイトル、リンク、記述、言語、イメージ・・・等)は、「XMLGet (0,1,'rss.channel.title')」とか、「XMLGet (0,1,'rss.channel.link')」のように指定して取得します。
 アイテムの情報は、子タスクを作ってループさせ、メモリテーブルに書き出します。更新の逆順で並んで列挙されてますから、それを順に読んでいけばOKです(勿論、更新時刻「pubDate」で並べ替えても良いんですが・・・)。一つ変数を作ってまわせばOKです。それぞれの項目を取得します。タイトルが「XMLGet (1,1,'rss.channel.item['&Trim (Str (変数,'2'))&'].title')」、リンクが、「XMLGet (1,1,'rss.channel.item['&Trim (Str (変数,'2'))&'].link')」というように、読んであげればそんなに面倒ではないですね。

 アイテムを取得した順にテーブルに表示してあげれば一覧が表示されます。作ったプログラムでは、各レコードに付けたボタンをクリックすると、そのページを表示するような仕組みにしてあります。

 画面を見てもらえば分かると思いますが、「分類」とか、「メンバー」とかRSSには無い項目があります。
 自動的にアイテムを出力するような仕様(PloneとZopeがしてくれる)となっているので、ドキュメントだったり、ニュースだったりします。それとポータル全体が対象なので、別製品の情報があったりもします。それらを分類したかったんですが、頼りになりそうなのはURL「rss/channel/item/link」だけだったので、フォルダ名やファイル名で自動的に振り分けるようにしました(うちのサイト専用の仕様ですね)。それと、メンバーしか見れないページも一緒に出てしまうので、それは色分けしてみました。
 こういったところも元のxmlのスキーマでなんとかできると良いですね。

 ということで、次のバージョンから実装されます。「RSS情報」というタブを押したときに、このサイトに接続しますので、予めご了解ください。

P.S
 RSSを公開してしまうと、ちょっとした修正でも、いじったことがバレてしまいますね。まぁしょうがないですけど・・・。w


カテゴリ
dbMAGIC

MAGIC V10解析(1)

 MAGICのVersion 10(以下「V10」)のβ版が公開されてからしばらく経ちますが、正直、あまり評価のほうは進んでいない状態です。でも、そうも言ってられないので、少しいじりながら自分の備忘録のためにも、このブログですこしずつでもまとめていこうかと考えています。

 さて、V10の目玉としては、今までアプリケーションのリポジトリ自体を開くのに、データベースエンジンが必要とされていましたが、それらのソースが全てXMLになったこととです。噂では実行版を動かすときも、暗号化されたXMLを解凍してそれを読み込んで動くらしいです。(ちょっとパフォーマンス的に心配なところもあるんですけど、大丈夫なんでしょう・・・)

 XMLのリポジトリを解析する作業は、ちょっと個人的には楽しみにしているところでもあるんですけど、何しろこの数ヶ月は割ける時間が無さそうなので、地道にやろうと思っています(ライフワークが増えた?)。ちょっと見た目には、V9のリポジトリファイルよりはより理解し易い記述だと思います(当たり前ですね(^^;)。

 まずはとっつきやすいところとして、プロジェクトフォルダの下にできる「Source」フォルダを見ると、「ProgramHeaders.xml」というファイルがあります。
 これは、言わばプログラムの一覧を管理しているテーブルで、IDに対するプログラム名や、修正日付、パラメータ、コメント等の一覧を取得するには好都合のファイルです。
v10prghead.jpg

 今回は、スタイルシートを使って、このXMLファイルからプログラム一覧表を作ってみようと思います。

 まず、スタイルシートは、XML内に記述することも可能ですが、V10が作るXMLファイルを直接書き換える訳にはいかないので、DOMのオブジェクトを使い、スタイルシートとXMLをロードして表示させるHTMLファイルを作ることにします。プロジェクトフォルダに「prg01.htm」という名前で作りましょう。

<html>
<head>
<title>プログラム一覧</title>
<script language="JavaScript">
<!--
function disp(){
 var objDoc=new ActiveXObject("Microsoft.XMLDOM");
 objDoc.async=false;
 objDoc.load("Source/ProgramHeaders.xml");
 var objStl=new ActiveXObject("Microsoft.XMLDOM");
 objStl.async=false;
 objStl.load("prg01.xsl");
 lst.innerHTML=objDoc.transformNode(objStl);
}
// -->
</script>
</head>
<body  onload="disp()">
<div id="lst"></div>
</body>
</html>

 更に、スタイルシート(prg01.xsl)を作成します。
 取り敢えず、下記のソースをコピペしてください。

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" version="4.0" encoding="Shift_JIS" />
<xsl:template match="/">
 <html>
 <head><title>プログラム一覧</title></head>
 <body>
  Version : <xsl:value-of
select="Application/Header/Version/@val" /><br/>
  WithIsn : <xsl:value-of
select="Application/Header/WithIsn/@val" /><br/>
  <xsl:apply-templates select="Application" />
 </body>
 </html>
</xsl:template>
<xsl:template match="Application">
 <xsl:apply-templates select="ProgramsRepositoryHeaders" />
</xsl:template>
<xsl:template match="ProgramsRepositoryHeaders">
 <table border="2" width="100%" align="center">
 <tr bgcolor="#f0f0c0">
  <td align="center" colspan="7">
<b>ProgramsRepositoryHeaders</b></td>
 </tr>
 <tr bgcolor="#c0f0f0">
  <td width="6%" align="center" valign="middle" rowspan="2">
<nobr>id</nobr></td>
  <td width="44%" align="center" valign="middle" rowspan="2">
<nobr>Description</nobr></td>
  <td width="10%" align="center" valign="middle" colspan="2">
<nobr>Parameters</nobr></td>
  <td width="10%" align="center" valign="middle" colspan="2">
<nobr>LastModified</nobr></td>
  <td width="30%" align="center" valign="middle" rowspan="2">
<nobr>comment</nobr></td>
 </tr>
 <tr bgcolor="#c0f0f0">
  <td width="5%" align="center" valign="middle">
<nobr>Count</nobr></td>
  <td width="5%" align="center" valign="middle">
<nobr>Attributes</nobr></td>
  <td width="5%" align="center" valign="middle">
<nobr>Date</nobr></td>
  <td width="5%" align="center" valign="middle">
<nobr>Time</nobr></td>
 </tr>
 <xsl:for-each select="Program">
  <tr>
  <td align="right" valign="top" >
<xsl:value-of select="Header/@id" /></td>
  <td align="left" valign="top" >
<xsl:value-of select="Header/@Description" /></td>
  <td align="right" valign="top" >
<xsl:value-of select="Header/ReturnValue/ParametersCount/@val" /></td>
  <td align="left" valign="top" >
<xsl:value-of
select="Header/ReturnValue/ParametersAttributes/@ParametersAttributes"/>
</td>
  <td align="left" valign="top" ><xsl:value-of
select="Header/LastModified/@date" /></td>
  <td align="left" valign="top" ><xsl:value-of
select="Header/LastModified/@time" /></td>
  <td align="left" valign="top" ><xsl:value-of
select="Header/Comment/@val" /></td>
  </tr>
 </xsl:for-each>
 </table>
 <p />
</xsl:template>
</xsl:stylesheet>

 以上で完成です。あとは、プロジェクトフォルダに置いた、「prg01.htm」をダブルクリック等で実行します。

v10prgheadxsl.jpg

 この2つのファイルをプロジェクトフォルダにコピーすれば、取り敢えずどんなアプリケーションでも、プログラムの一覧は簡単に表示させることが可能と言うわけです。

 今度は、V10を開いて、プログラムを修正してみます。「F12」キーでメインプログラムにコメントを入れてみます。

v10prgheadmemo.jpg

 プログラムは書き換わったようですが、ブラウザの再表示を行っても変化がありません。
 今度は、V10側でプロジェクトを閉じてみます。
 再度、ブラウザの再表示を行うと今度は記載したコメントが表示されました。

v10prgheadxsl2.jpg

 タイミング的には、メモリ内に編集内容が保持されているのでしょうか。プロジェクトを閉じるときに実際のリポジトリであるXMLへの書き出しが行われているようです。


カテゴリ
dbMAGIC

MAGIC V10解析(2)


 前回は、開発中のアプリケーションを管理しているXMLファイルからプログラムの一覧を取得するためのスタイルシートを作成しました。「ProgramHeaders.xml」というファイルを見ることにより、プログラムの一覧が取得できることがお分かり頂けたと思います。

 プログラム関連のファイルには、「ProgramHeaders.xml」というファイル以外にもいくつかあるようです。これらをまとめると下表のようになります。

No.
ファイル名
主な目的
1
ProgramHeaders.xmlプログラムをID順に列挙し、プログラム名や更新時刻を記述
2Progs.xml開発画面のプログラムリポジトリの表示並び順を管理
また、フォルダの情報と、そのプログラムリポジトリ画面内の位置を管理
3Prg_####.xml
実際のプログラム毎の内容を記述。
「####」はプログラムのidで、登録順に連番が振られる。画面の表示番号とは必ずしも一致しない。

 さて、ここで話は変わります。V10になって、リポジトリ出力の形式もすべてのタイプについてXMLとなっているようです。
 「リポジトリ入出力」で、「タイプ」を「E=プロジェクト全体」として指定すると、アプリケーション全てを1個のXMLファイル(ファイル名初期値:「Project.xml」)に出力するようです。

 これをieで開くと下記のような構造になりました(ルート配下のみ表示)。

v10project.jpg

 V9までのリポジトリファイルをご存知の方はよく分かると思いますが、構造的にはほぼ同一で、順番も似ています(HelpRepositoryの位置はだいぶ前に移動などしていますが・・・)。
 それでは、このプロジェクトリポジトリのXMLファイルの中で、プログラムの関連はどのように記述されるのでしょうか?
 メインプログラムに相当する部分を、プロジェクトリポジトリで表示すると下図のようになります。

v10prg_project.jpg

 同じメインプログラムのリポジトリファイル(Prg_1.xml)を表示すると下図のようになります。

v10prg_prog_1.jpg

 結論的には「Prg_####.xml」を、(ID順ではなく)プログラムリポジトリ画面表示順に出力したものとなっています。ProgramHeaders.xmlや、Progs.xmlに記載されていた内容はありません。これらの2つのファイルは、プログラムの追加や削除などの更新による表示順を管理しているだけで、最終的な段階では吸収されるものと考えることができます。

 今回は、ためしに、このプロジェクトリポジトリのXMLから前回と同様にプログラムの一覧を取得してみます。

 前回作成したファイル(prg01.html、prg01.xsl)をそれぞれコピーして「prg02.html」、「prg02.xsl」を作成します。それぞれのソースを下記のように修正して下さい。

prg02.htmlの9行目と、12行目を下記のように修正します。(2つの読み込むファイルを変えるだけです。)
9行目:    objDoc.load("Export/Project.xml");
12行目:    objStl.load("prg02.xsl");

prg02.xmlは下記のソースをコピペします。

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" version="4.0" encoding="Shift_JIS" />
<xsl:template match="/">
<html>
<head><title>プログラム一覧</title></head>
<body>
Version : <xsl:value-of select="Application/Header/Version/@val"/><br/>
WithIsn : <xsl:value-of select="Application/Header/WithIsn/@val"/><br/>
<xsl:apply-templates select="Application" />
</body>
</html>
</xsl:template>
<xsl:template match="Application">
<xsl:apply-templates select="ProgramsRepository" />
</xsl:template>
<xsl:template match="ProgramsRepository">
<xsl:apply-templates select="Programs" />
</xsl:template>
<xsl:template match="Programs">
<table border="2" width="100%" align="center">
<tr bgcolor="#f0f0c0">
<td align="center" colspan="7"><b>ProgramsRepositoryHeaders</b></td>
</tr>
<tr bgcolor="#c0f0f0">
<td width="6%" align="center" valign="middle" rowspan="2">
<nobr>id</nobr></td>
<td width="44%" align="center" valign="middle" rowspan="2">
<nobr>Description</nobr></td>
<td width="10%" align="center" valign="middle" colspan="2">
<nobr>Parameters</nobr></td>
<td width="10%" align="center" valign="middle" colspan="2">
<nobr>LastModified</nobr></td>
<td width="30%" align="center" valign="middle" rowspan="2">
<nobr>comment</nobr></td>
</tr>
<tr bgcolor="#c0f0f0">
<td width="5%" align="center" valign="middle"><nobr>Count</nobr></td>
<td width="5%" align="center" valign="middle"><nobr>Attributes</nobr>
</td>
<td width="5%" align="center" valign="middle"><nobr>Date</nobr></td>
<td width="5%" align="center" valign="middle"><nobr>Time</nobr></td>
</tr>
<xsl:for-each select="Task">
<tr>
<td align="right" valign="top" ><xsl:value-of select="position()"/>
</td>
<td align="left" valign="top" >
<xsl:value-of select="Header/@Description" /></td>
<td align="right" valign="top" >
<xsl:value-of select="Header/ReturnValue/ParametersCount/@val" /></td>
<td align="left" valign="top" >
<xsl:value-of
select="Header/ReturnValue/ParametersAttributes/@ParametersAttributes"/>
</td>
<td align="left" valign="top" >
<xsl:value-of select="Header/LastModified/@date" /></td>
<td align="left" valign="top" >
<xsl:value-of select="Header/LastModified/@time" /></td>
<td align="left" valign="top" >
<xsl:value-of select="Header/Comment/@val" /></td>
</tr>
</xsl:for-each>
</table>
<p />
</xsl:template>
</xsl:stylesheet>

 前回は、プログラムのIDを「Application/ProgramsRepositoryHeaders/Program/Header/@id」で取得しましたが、今回の場合は、
 プログラム番号を「Application/ProgramsRepository/Programs/Task/position()」で記述の順番から取得しています。(position関数を使用)
 比較してみて頂ければお分かりかと思いますが、前回とほとんど似たようなソースとなっていますが、微妙にノードが変わっています。

 それでは、プロジェクトリポジトリをスタイルシートで表示させてみます。

v10projectPXLS.jpg

前回とほぼ同様の結果が得られることが分かりました。
プロジェクトファイルともなると、膨大な、サイズのファイルになる場合も多いかと思いますが、このような簡単なスタイルシートを作成しておくことにより、その全体像を知ることが可能です。これもXMLならではのことですね。


MAGIC V10解析(1) MAGIC V10解析(1)
サイズ 8337 - File type text/html
カテゴリ
dbMAGIC

MAGIC V10解析(3)


 今日はクライアントの人たち(同業者)と、ちょっとした忘年会でした。ほんとに楽しかった。話題は尽きず、あっという間に数時間が過ぎてしまった・・・。
 ということで、今帰ったところです。
 その席上、このブログを見てくれていると聞いて、ちょっと嬉しかった。でもその彼に言われた。「あんなこと書いて良いんですか?」って・・・。どういう意味かと一瞬考えたけど、「え、誰もみてないでしょう?」と思わず答えてしまった・・・。うーん、変な応え・・・。(^^;
 でも、なんか悪いこと書いてるのかな?(w)

 さて、前回までは、プログラムの一覧の取得だったんですが、それよりちょっとやっかいな問題は、タスクの一覧取得です。なぜなら、タスクは再帰的に記述されているんです。
 あまりよい例が無いので、テスト用にプログラムを作成してみます。

v10tasktree.jpg

 このプログラムのXMLファイルをブラウザで見たのが下図です。

v10taskxmltree.jpg

 そう、<Task>タグの中に、また<Task>タグが出てくるんですね!

 でも、ご安心。XSLTは何だってできます!
 取り敢えず、いつものように、prg03.htmlを作成して、9行目と、12行目を下記のように修正します。(##の部分はテストするプログラムのid番号を指定します。)

9行目:    objDoc.load("Source/Prg_##.xml");
12行目:    objStl.load("prg03.xsl");
prg03.xslは下記のソースをコピペします。
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 version="1.0">
<xsl:output method="html" version="4.0" encoding="Shift_JIS" />
<xsl:template match="/">
<html>
<head><title>プログラム内タスク一覧(その1)</title></head>
<body>
<xsl:apply-templates select="Application" />
</body>
</html>
</xsl:template>
<xsl:template match="Application">
<xsl:apply-templates select="ProgramsRepository" />
</xsl:template>
<xsl:template match="ProgramsRepository">
<xsl:apply-templates select="Programs" />
</xsl:template>
<xsl:template match="Programs">
<xsl:apply-templates select="Task" /> ・・・①
</xsl:template>
<xsl:template match="Task">
<xsl:value-of select="concat(Header/@ISN_2,'.',
Header/@Description)" /><br/>
<xsl:apply-templates select="Task"/>   ・・・②
</xsl:template>
</xsl:stylesheet>
 ①、②と入れたところは、ソースに書かないで下さいね。
 ①で呼ばれるテンプレートの中の②のところで、再度自分自身(Taskのテンプレート)を呼んでいます。(ここがミソです!)
 これで、再帰的に、タスクの番号(Header/@ISN_2)とタスク名(Header/@Description)の一覧を取得します。「concat()」関数は文字列の連結を行うものです。
 さて、結果を見てみましょう!

v10tasktreeres.jpg

 あれ?なんで6の次が8なの?
 そう言えば、間違って作成してしまったタスクを1個削除したんです。それで1個飛んでしまったわけですね。(なるほど・・・)

 一応、タスクの一覧は取得できたんですけど、これではツリーっぽくないですね。ネストしてる雰囲気が無いので、ちょっと工夫してみたのが次の改良版です。
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 version="1.0">
<xsl:output method="html" version="4.0" encoding="Shift_JIS" />
<xsl:template match="/">
<html>
<head><title>プログラム内タスク一覧(その2)</title></head>
<body>
Version : <xsl:value-of select="Application/Header/Version/@val"/><br/>
WithIsn : <xsl:value-of select="Application/Header/WithIsn/@val"/><br/>
IsRoot : <xsl:value-of select="Application/Header/IsRoot/@val"/><br/>
InIndex : <xsl:value-of select="Application/Header/InIndex/@val"/><br/>
<p />
<xsl:apply-templates select="Application" />
</body>
</html>
</xsl:template>
<xsl:template match="Application">
<xsl:apply-templates select="ProgramsRepository" />
</xsl:template>
<xsl:template match="ProgramsRepository">
<xsl:apply-templates select="Programs" />
</xsl:template>
<xsl:template match="Programs">
<table border="2" width="100%" align="center">
<tr bgcolor="#f0f0c0">
<td align="center" colspan="10"><b>ProgramsRepository</b></td>
</tr>
<tr bgcolor="#c0f0f0">
<td width="4%" align="center" valign="middle" rowspan="2">
<nobr>No.</nobr></td>
<td width="4%" align="center" valign="middle" rowspan="2">
<nobr>Levl</nobr></td>
<td width="4%" align="center" valign="middle" rowspan="2">
<nobr>Tree</nobr></td>
<td width="2%" align="center" valign="middle" rowspan="2">
<nobr>B/O</nobr></td>
<td width="36%" align="center" valign="middle" rowspan="2">
<nobr>Description</nobr></td>
<td width="10%" align="center" valign="middle" colspan="2">
<nobr>Parameters</nobr></td>
<td width="10%" align="center" valign="middle" colspan="2">
<nobr>LastModified</nobr></td>
<td width="30%" align="center" valign="middle" rowspan="2">
<nobr>Comment</nobr></td>
</tr>
<tr bgcolor="#c0f0f0">
<td width="5%" align="center" valign="middle">
<nobr>Count</nobr></td>
<td width="5%" align="center" valign="middle">
<nobr>Attributes</nobr></td>
<td width="5%" align="center" valign="middle">
<nobr>Date</nobr></td>
<td width="5%" align="center" valign="middle">
<nobr>Time</nobr></td>
</tr>
<xsl:apply-templates select="Task" />
</table>
<p />
</xsl:template>
<xsl:template match="Task">
<xsl:param name="TDepth" select="0" />
<xsl:param name="TreeID" select="0" />
<tr>
<td align="right"><xsl:value-of select="Header/@ISN_2" /></td>
<td align="right"><xsl:value-of select="$TDepth" /></td>
<td><xsl:value-of select="substring(concat($TreeID,'.'
,string(position())),4)" /></td>
<td><xsl:value-of select="Header/TaskType/@val" /></td>
<td><xsl:value-of select="Header/@Description" /></td>
<td align="right">
<xsl:value-of select="Header/ReturnValue/ParametersCount/@val"/>
</td>
<td align="left">
<xsl:value-of
select="Header/ReturnValue/ParametersAttributes/@ParametersAttributes"/>
</td>
<td><xsl:value-of select="Header/LastModified/@date"/></td>
<td><xsl:value-of select="Header/LastModified/@time"/></td>
<td><xsl:value-of select="Header/Comment/@val"/></td>
</tr>
<xsl:apply-templates select="Task">
<xsl:with-param name="TDepth" select="$TDepth + 1" />
<xsl:with-param name="TreeID" select="concat($TreeID,'.',
string(position()))"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
 一部、ちょっと荒っぽい書き方してるんですが、ご勘弁・・・。
 結果は次の通り!おぉ、やればできるもんです。(>XSLT)

v10tasktreetbl.jpg



MAGIC V10解析(1) MAGIC V10解析(1)
サイズ 8337 - File type text/html
MAGIC V10解析(2) MAGIC V10解析(2)
サイズ 8904 - File type text/html
カテゴリ
dbMAGIC

MAGIC V10解析(4)


はじめに

 新年おめでとうございます。
 今年も宜しくお願い致します。

 さて、このCMSとして利用させて頂いているPloneですが、ちょっと内部的なデータがおかしくなってしまいまして(とあるデータが壊れた?)、この週末の休みを利用しデータを再構築しました。手順としては別なマシンにPloneをインストールし、それを同じようにカスタマイズし、最後に昨日までのこのサイトのデータを移し、全て同じように復元致しました。
 入力するときは大変な労力を要したので、それと同じような作業量は最初から覚悟していたのですが、Ploneにはデータの入出力機能(Export, Inport)がありそれを使うことでとてもスムーズに作業を完結させることができました。例えば、「MAGIC Decrypter」とかタブが出ている単位でサブフォルダにデータが格納されているのですが、それを単位に一括してデータの移行ができるんです。それに気付き、とても重宝しました。
 まずは、無事生き返りホッとしているところです。

 えーと、話を戻します。前回はプログラムのソースのタスク構造をXMLスタイルシートを使って再帰的に取得することを行いました。でも、開発の場面でXMLスタイルシートを使うようなことはあまり無いかも知れませんね。私としては、XMLになったということの「恩恵」として、ひとつはこういうこともできるよ・・・ということが言いたかったんです。
 さて、今日の本題は、V10で新しく機能が追加された「XML連携」に関することです。V10でMAGICは、標準のデータソースとしてXMLファイルを使用することができるようになりました。この機能は結構強力なので、いろいろなケースで威力を発揮するのではないかと思います。その反面、ちょっと「悩み」も増えてしまったんですが・・・。(このあたりはまたいつか話題にしたいと思います。)
 何はともあれ、今回はこの機能を使ってスタイルシートで行ったようにプログラムの一覧を表示してみようと思います。


スキーマの定義

 「XML連携」の機能を使う上で、XMLスキーマの定義は必須です。(MAGIC V10のスキーマも最初から提供してくれれば良いと思うけど・・・(^^;)
 でも「XMLSPY」とかを使えば楽勝でしょう。(私もフリー版の「Home Edition」を使用しています。)
 手順は慣れれば思ったより簡単です。XMLファイルのタグを階層的に連結させながら、階層構造図を描けばOKです。そのとき、属性値とかは省略せずに入力していきます。特にMAGIC V10のリポジトリの場合は、殆ど「属性」を使ってデータの値を定義している模様です。これを省略してしまうと、項目の値が取り出せませんし、数値にするか文字にするかなど、項目の型の判定にも影響が出ます。(なるべく数値らしきところは「integer」などを選択しましょう。)

 ProgramHeaders.xmlのソースの先頭部分は次のようになっていると思います。

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Application>
  <Header>
    <Version val="10001"/>
    <WithIsn val="Y"/>
  </Header>

この部分のXMLスキーマの入力手順は次のとおりです。


  • XML SPYを起動
  • 新規作成で、ドキュメントのタイプ=xsdを選択する
  • 「ENTER_NAME_OF_ROOT_ELEMENT_HERE」と書かれているところに「Application」と入力
  • 一番左にあるボタンをクリックし、画面を変える
  • 「Application」ボックスを右クリックし、「Add Child」で「Sequence」を選択
  • 追加された「Sequence」で右クリックし、「Add Child」」で「Element」を選択し「Header」を入力
  • 追加された「Header」ボックスを右クリックし、「Add Child」で「Sequence」を選択
  • 追加された「Sequence」で右クリックし、「Add Child」」で「Element」を選択し「Version」を入力、更にAttributes画面で「Attribute」を選択し、Nameに「val」を入力、Typeに「xs:integer」を選択
  • 同じく「Sequence」で右クリックし、「Add Child」」で「Element」を選択し「WithIsn」を入力、更にAttributes画面で「Attribute」を選択し、Nameに「val」を入力、Typeに「xs:string」を選択


 ここまでで、下図のような画面になると思います。

v10xsd01.jpg




 「Application/Header」の部分が終わりましたので、次は「Application/ProgramsRepositoryHeaders」からの入力を進めます。
 スキーマの入力を完成させ、最後にファイルを保存します。(「ProgramHeaders.xsd」などの名前で登録します。)

v10xsd02.jpg




データリポジトリの定義

 さて、いよいよV10の登場です。
 適当な名前の新規プロジェクトを作成します。このとき、下記の論理名を定義しておきましょう。

[MAGIC_LOGICAL_NAMES]
Project=(リポジトリの内容を検索させるプロジェクトのパス名)
Source=%Project%\Source

データリポジトリの画面を開き、下記のように定義します。

データリポジトリ名:ProgramHeaders
データソース名:%Source%\ProgramHeaders.xml
データベース:Default XML Database


プルダウンメニューの「オプション」から「定義取得」を実行し、作成したスキーマファイルのファイル名(ProgramHeaders.xsd)を入力します。
このとき、プロジェクトフォルダに格納しておくと、プロジェクトフォルダからの相対パス名で指定できるようです。

v10xsd03.jpg


 スキーマファイルを読み込む際に、ルートの要素を聞いてくるかもしれません。その時は「Application」を指定します。
 正常に読み込まれると、ビューにツリーが表示されます。
 次に、テーブルとして表示させる位置(MAGICでは「ビューのメイン要素」と呼ぶ模様)を指定します。
 ノードの位置「/Application/ProgramsRepositoryHeaders/Program/Header」をクリックし、マウス右ボタンから「ビューに含める」を選択します。

v10xsd04.jpg




 初期値では、属性のタイプが「xs:string」のものは、文字タイプの書式「15」に、同じく「xs:integer」のものは数値の書式「N10」に設定されます。不適切なものは書式を修正しておきます。

v10xsd05.jpg


 インデックスを追加しておきましょう。タブの「インデックス」をクリックします。
 例えば、「id」をインデックスとして作成しておきます。

v10xsd06.jpg


 これで、データ定義が終了しました。

実行結果


 とりあえず、APGを使って実行してみましょう。「Ctrl+G」キーを押して実行させ、下記のような画面が表示されれば成功です。

v10xsd07.jpg


 MAGICに慣れた人なら、テーブル(現在はデータになったんですね)として定義さえできれば、あとは言わずもがなですね。
 XMLファイルの場合は、同じファイルの中でもループする部分が幾つかあるので、その度毎に「ビューのメイン要素」を定義することになります。
 なお、「ノードID」はどのようにして割り振られるのかは定かではありませんが、XMLファイルの全ノードに対してユニークな番号を割り当てるようです。親ノードを正しく指定すれば、この画面からレコードの追加(ノードの追加)もできるようです。


★参考ファイル


 今回作成したスキーマファイル(ProgramHeaders.xml)


MAGIC V10解析(1) MAGIC V10解析(1)
サイズ 8337 - File type text/html
MAGIC V10解析(2) MAGIC V10解析(2)
サイズ 8904 - File type text/html
MAGIC V10解析(3) MAGIC V10解析(3)
サイズ 9714 - File type text/html
カテゴリ
dbMAGIC