続コンストラクタ + XPath
下のエントリに書いたコンストラクタの挙動だがなんか違ってるかも。
もしかするとコンストラクタは一箇所だけ動くのが正しい挙動なのかなーー
実際テストしたときは2度動いたのは確認しているけどもしかしてasoフォルダにたまるキャッシュみたいなのが悪さしてるのかなというきもしてきた。
で、そんな疑問がXPathという便利なものをいじっていてでてきたわけです
あといまいちわからないのは
myScopeというグローバル変数はstaticにしとかないとxml.onLoad内ではundefinedになってしまうのがよくわからん。
逆にXPathはonLoad外ではエラーになってしまうので引数で渡しといた。これはXPathの中みてけばわかりそうなきもするがXMLのなんかを継承しているとかいうノリだろうか?
もう一点、 myScopeにthisを代入する命令はサブクラスの方に書いておかないとオーバーライドしたはずのメソッドparseMyXMLが動かなかった。もしかするとこれはstaticにしてることが影響してるのかな。その辺も今のところよくわかりません。
だらだら書いたけどとりあえずXPathは凄く使えそうということで本日は終了
(xmlLoader.as)
import com.xfactorstudio.xml.xpath.*;
class xmlLoader extends Object{
var url:String;
var myDoc:XML;
static var myScope:Object
function xmlLoader(urlPolicy:String){
if(urlPolicy){
setLoadPolicy(urlPolicy);
}
myScope = new Object();
myScope = this;
trace("xmlLoader");
}
function setLoadPolicy(str:String){
System.security.loadPolicyFile(str);
}
function loadXML(url:String, callBack:Function, scope:Object){
myDoc = new XML();
myDoc.ignoreWhite = true;
myDoc.onLoad = function() {
callBack.apply(scope, myScope.parseMyXML.call(this, XPath));
};
myDoc.load(url);
}
//オーバーライド用
function parseMyXML(){
trace("hoge");
}
}
(xmlParser.as)
class xmlParser extends xmlLoader{
function xmlParser(urlPolicy:String){
if(urlPolicy){
super.setLoadPolicy(urlPolicy);
}
myScope = this;
};
function parseMyXML(xTarget){
var urlBlog = xTarget.selectNodes(this, "/blogIndex/@blogURL");
var titles_array:Array = xTarget.selectNodes(this, "/blogIndex/entry/@entryTitle");
var excerpt_array:Array = xTarget.selectNodes(this, "/blogIndex/entry/@entryExcerpt");
var entryId_array:Array = xTarget.selectNodes(this, "/blogIndex/entry/@entryID");
return [urlBlog, titles_array ,excerpt_array, entryId_array];
}
}(fla)
function loadInit( urlBlog:String,titles_array:Array ,excerpt_array:Array, entryId_array:Array){
var l = titles_array.length;
for (var i = 0; i < l; i++ ) {
trace(titles_array[i]);
var clip = _root.attachMovie("entryMc","entryMc"+ i, i);
clip.sTitle = String(titles_array[i]);
clip.entryId = parseInt(entryId_array[i],10);
clip.sUrl = String(urlBlog);
clip._y = clip._height * i+ clip._y+ 50;
}
}var url = "xxx.xml";
var urlPolicy = "policy.xml";
var x:Object = new xmlParser(urlPolicy);
x.loadXML(url, loadInit, this);