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