XMLファイルをスタックに取り込む
LiveCodeスタックにXMLファイルを取り込む作業をまとめてみました。
まず左の様なサンプルファイルを用意します。
仕分という親に、摘要という子があり、それは備考という子を持っています。
摘要は、tekiyouという属性を持ち、備考は bikouという属性を持っています。
そして、備考はそれぞれ値を持っています。
このファイルを読み込んで利用します。
スタックにはボタンを一つとフィールドを二つ用意しました。
まずはボタンに書き込むスクリプトです。
1行目のanswer fileで、ファイルの場所を求めています。
2行目でそれを変数に収めて、3行目でURLにまとめています。
4行目で、そのURLを使ってXMLツリーを作っているわけです。
ここで、put 〜intoしている gDenTreeの中身は ここで作られたXMLツリーのID番号です。これは放っておくとスクリプトの終了とともになくなってしまいますから、最後の行で、IDfieldに格納して表示させています。
XMLツリーはメモリー上に残っていますから、次にこれを利用するためには、このフィールドの番号を使えば良いわけです。もちろん、グローバル変数に入れておくという手もありますね。
結果は (fld data1)
<仕分>
<摘要 name=”ガソリン”>
<備考 name=”キグナス”>2200</備考>
<備考 name=”ENEOS”>3000</備考>
</摘要>
<摘要 name=”駐車場”>
<備考 name=”コインパーキ
ング”>200</備考>
<備考 name=”タイムス”>1000</備考>
</摘要>
</仕分>
属性の部分が文字化けしてしまっています。
3行目で、XMLファイルから直接 XMLツリーを作成しています。
4行目、url(“file:”&tFile)で、XMLファイルのパスを解析しています。ここで、テキストファイルとして中身を取り出しています。
そのままではutf16ですから、文字化けしてしまいますので、textDecodeしてあげます。
つまり、このスクリプトではXMLツリーを読み込んでIDナンバーを得ることと、その元になったXMLファイルを表示することを行なっています。
左の様なスクリプトを実行させると、先にボタンに書いたスクリプトと同じ様にXMLファイルをメモリーに展開することが出来るのですが、それにはいくつかの条件がある様です。
まず、ファイル名に2バイト文字が使われていてはいけません。その場合xmlエラーになり、dDenTreeにはID番号が入るかわりにエラーメッセージが入ります。
それから、ファイルのパスに、2バイト文字が含まれていないこと。
これらをクリアしていると、結果は (fld data1)
<?xml version=”1.0″?>
<仕分>
<摘要 name=”ガソリン”>
<備考 name=”キグナス”>2200</備考>
<備考 name=”ENEOS”>3000</備考>
</摘要>
<摘要 name=”駐車場”>
<備考 name=”コインパーキング”>200</備考>
<備考 name=”タイムス”>1000</備考>
</摘要>
</仕分>
ここでは、属性も文字化けせずに表示されています。
違いはメモリーに展開したものをフィールドに入れた場合と、ファイルを直接デコードして表示した場合。なので、取り込んだXMLファイルを編集した場合、それを一旦元のファイルに保存してから表示させないといけないことになります。
ファイルのパスに2バイト文字が入っていなければ、ファイルの内容に2バイト文字が入っていても関係なくXMLファイルがメモリーに展開されます。
次に左の様なxml書類を用意しました。LiveCodeの辞書に載っているサンプルです。
みてわかる通り、2バイト文字を使わずに記述されています。このXMLファイルの場合、一番上のスクリプトを使ってツリーIDからrevMXLTextを使ってフィールドに表示させても文字化けはしません。
日本語の使えるシステムを走らせているコンピュータでは、どうしてもファイルのパスに2バイト文字が入ってしまう可能性を排除することは出来ないとおもいますので、revCreateXMLTreeFromFileを使うよりも、一旦テキストデータにしたものをrevCreateXMLTreeを使ってXMLツリーを構築した方が安全な様です。