読者です 読者をやめる 読者になる 読者になる

まめ畑

ゆるゆると書いていきます

XPath4AS2を使ってみた

ActionScript

せっせとWidgetを使っているのですが、今回は大きめのXMLを処理する必要があったのでXpathが使えるライブラリを探したところ「XPath4AS2」が見つかったので使ってみました。
今回もFlashDevelopです。
前回も生放送WidgetXMLを処理しているのですが、あれは中でめちゃくちゃ簡単なパーサを自分で書いています。


XFactor StudioからDLして解凍します。
comフォルダを現在作業しているプロジェクトのソースディレクトリに置くか、グローバルクラス登録します。


使い方は至極簡単で

//インポート
import com.xfactorstudio.xml.xpath.*;

var list:Array;
var xml:XML = new XML();
xml.ignoreWhite = true;
xml.onLoad = function(success:Boolean) {
    if (success) {
        list = XPath.selectNodesAsString(this, "root/messages/message/text()");
	//処理する関数などを呼び出したり
    }else{
        alert("Error");
    }
}
xml.load("http://hoge/fuga.xml");    //ローカルファイルでもおk

簡単ですね。
前回もこれを使えばよかった。

XPath.selectNodesAsString(XMLオブジェクト, "Xpath式");

今回はxml.onLoadイベントハンドラ内で処理をしているので「this」を指定しましたが、XMLオブジェクトの変数をいれます。
あとはXpath式を書いてやるだけです。
指定した要素が配列で返ってきます。
「text()」を指定するとタグは取り除かれテキストだけが取得できます。


今回少しはまったのが、大きなXMLを処理しようとして、selectNodesAsString()を呼び出すと、それまで行っていた処理が止まってしまう事。
簡単に書くと。

function hoge():void
{
 //音声の再生準備
 //再生スタート

 var list:Array;
 var xml:XML = new XML();
 xml.ignoreWhite = true;
 xml.onLoad = function(success:Boolean) {
    if (success) {
        list = XPath.selectNodesAsString(this, "root/messages/message/text()");   //ここに処理が来ると音声停止
        //色々処理
    }else{
        alert("Error");
    }
 }
 xml.load("http://hoge/fuga.xml");
}

XMLファイルのサイズが小さくなると問題ないのですが、サイズが大きくなると止まります。
同じ関数内で音声の準備や再生スタートをしなくても同じ結果。

解決策としては

function hoge():void
{
 //音声の再生準備

 var list:Array;
 var xml:XML = new XML();
 xml.ignoreWhite = true;
 xml.onLoad = function(success:Boolean) {
    if (success) {
        list = XPath.selectNodesAsString(this, "root/messages/message/text()");   //ここの処理が完了後再生
	doSomething();
    }else{
        alert("Error");
    }
 }
 xml.load("http://hoge/fuga.xml");
}


function doSomething():void
{
   //音声の再生
}

Xpathの処理が完了したら再生するようにすると問題なし。


処理が一時的に停止するのではなくて、ずっと止まったままになってしまうのが気になるところ。
他の処理は動いているけど、動画の再生だったりも止まる。


ASに不慣れすぎるのでもっと勉強しないといけない。
しかし、AS3も勉強しないとな。
WidgetはAS2でしか作れないので。