概要
吉里吉里には標準のライブラリとしてExpat.dllが含まれています。
ここではExpat.dllを使用して、簡単なXMLファイルを読み込む手順を説明します。
KKDE(Kiri Kiri Development Environment) ver 2.0.0で確認しました。
1. Expat.dllとは?何ができるの?
Expat.dllはC言語で書かれたXMLパーサです。
http://expat.sourceforge.net/
吉里吉里に標準で添付されており、XMLファイルを読み込んで、
「タグの開始」「タグの終了」「テキスト」を判別してくれます。
純粋なパーサとでも言うのか、本当に「解析機能」だけを提供するようです。
(解析したデータの保持もしないし、XMLファイルの書き出し機能もないです。
ゲームデータ管理なら、データ構造は独自のものである場合が多いので、
向いているのかもしれません)
2. Expat.dllを使ってみる
xmlファイルには「タグの開始」「タグの終了」「テキスト」が含まれます。
まず、これらに応じて、「何のタグの時データをどこへ格納するか」などの
処理を定義したイベントハンドラを作成します。
次に、expat.dllの XMLParser クラスに、読み込みたいxmlファイル名と
上記のイベントハンドラを渡すことで、処理が実行されます。
以下に、簡単なサンプルと、導入手順を説明します。
KKDEで、「ファイル→新規作成→プロジェクト作成」をクリックします。プロジェクトの種類として
「KAG3プロジェクト」、名前は適当に「readxmltest」、パスはどこでもよいです。
指定したパスにフォルダが生成されていることを確認します。
※ 以下簡単のため、今生成されたフォルダを「readxmltestフォルダ」、
KKDE本体があるフォルダを「kkdeフォルダ」と記載します。
kkde/krkr/kirikiri2/pluginフォルダを開くとexpat.dllがあるので、
readxmltest/pluginフォルダへコピーします。
読み込みたいxmlファイルを用意します。
ここではサンプルとして下記のようなxmlファイルを用意し、
readxmltest/others/sample.xml に保存します。
保存するとき、エンコードはUTF-8を指定します。
sample.xml
<?xml version="1.0" encoding="utf-8" ?>
<data>
<enemy>
<img file="slime01"/>
スライム。ぶよぶよ。
</enemy>
<enemy>
<img file="gobline01"/>
ゴブリン。むんむん。
</enemy>
</data>
エネミー一覧のようなデータを想定したサンプルとなっています。
enemyタグごとに、画像を現すimgタグと、説明を表すテキスト部分があります。
xml構造は厳密に検査されるようで、以下のような点に注意が必要です。
・ルート要素は1つでなければならない(上記では「data」)
・単体タグ(imgなど)は閉じカッコ">"の前にスラッシュ"/"をつける
KKDEに戻り、startup.tjsに処理を記述していきます。
ここではゲーム開始時にxmlファイルを読み込むことを想定して、
スクリプトの先頭にイベントハンドラクラスと、読み込み処理を記述しています。
startup.tjs
// startup.tjs - スタートアップスクリプト
// expat.dllをリンクする。
Plugins.link("expat.dll");
// データを格納するグローバル変数を定義。
var g_enemyList=new Array();
var enemyid=-1;
// イベントハンドラクラスを定義する
class EventTarget {
// 「タグの開始」を検出した時に呼ばれるイベントハンドラ
// nameにはタグ名が、dicにはタグの Attribute が 名前,値,名前,値, ... の順で配列で格納されている。
// 例:<a href="...URL..." target="_blank"> なら、name="a"、dic=["href","...URL...","target","_blank"];
function startElement(name, dic) {
// enemyタグならidを次へ、配列を初期化。
if(name=="enemy"){
enemyid++;
g_enemyList[enemyid]=new Array();
}
// imgタグならファイル名dic[1]を格納。
if(name=="img"){
g_enemyList[enemyid].img=dic.file;
}
}
// 「タグの終了」を検出した時に呼ばれるイベントハンドラ
function endElement(name) {
}
// 文字列データ(タグとタグの間のテキスト)を検出した時に呼ばれるイベントハンドラ
function characterData(data) {
// Trimなどして空白の要素は無視する
data=data.replace(/\n/g,"");
data=data.replace(/^\s+/g,"");
data=data.replace(/\s+$/g,"");
if(data=="") return;
// 格納
g_enemyList[enemyid].text=data;
}
}
// 読み込み処理の実行
var hnd=new EventTarget();
var parser = new XMLParser(hnd);
parser.parseStorage("others/sample.xml");
Scripts.execStorage("system/Initialize.tjs");
上記では、利用頻度が高いと思われる startElement と characterData を使用して、
グローバル変数 g_enemyList に エネミーごとの情報を格納しました。
first.ksを開き、読み込み結果を表示するように修正します。
first.ks
[wait time=200]
ExpatでXML読み込みテスト[r]
[r]
[emb exp="g_enemyList[0].text"][r]
[emb exp="g_enemyList[0].img"][r]
[emb exp="g_enemyList[1].text"][r]
[emb exp="g_enemyList[1].img"][r]
結果はこちら
3. その他のメソッド
上記の他にも、不正なXMLが検出された場合に呼ばれる関数なども登録できます。
詳しくは下記を参照ください。
http://hpcgi1.nifty.com/gutchie/wifky/wifky.pl?p=...
4. Expat以外のXML関連プラグイン