引用:
afromanさんは書きました:
はじめまして。いつも見て参考にさせてもらっています。
さて、現在xmlを読み込ませてるのですが、xmlのファイルが複数
あり、それを順番に表示さたいと思っています。
現状はそれぞれのxmlを異なる変数にして読み込ませてるのですが
これをもうちょっと効率よく1つのスクリプトで1つの数値をかえるだけでなんとかならないかと画策してる所です。
_root.neta[0].ignoreWhite = true;
_root.neta[0].load("neta0.xml");
_root.neta[0].onLoad = function(success) {
// xml解析
if (success) {
_root.neta[0].parseXML(neta);
_root.title[0] = _root.neta[0].firstChild.firstChild.firstChild.firstChild.nodeValue;
_root.link[0] = _root.neta[0].firstChild.firstChild.firstChild.nextSibling.firstChild.nodeValue;
_root.des[0] = _root.neta[0].firstChild.firstChild.firstChild.nextSibling.nextSibling.firstChild.nodeValue;
_root.lang[0] = _root.neta[0].firstChild.firstChild.firstChild.nextSibling.nextSibling.nextSibling.firstChild.nodeValue;
_root.item[0][0] = _root.neta[0].firstChild.firstChild.firstChild.nextSibling.nextSibling.nextSibling.nextSibling;
for (i=1; i<=3; i++) {
_root.item[0][i] = _root.item[0][i-1].nextSibling;
}
for (i=0; i<=3; i++) {
_root.neta_array[0][i] = _root.item[0][i].firstChild;
_root.Vneta_array[0][i] = _root.neta_array[0][i].firstChild.nodeValue;
_root.link_array[0][i] = _root.item[0][i].lastChild;
_root.Vlink_array[0][i] = _root.link_array[0][i].firstChild.nodeValue;
}
}
}
xmlは
neta0.xmlとし、
<channel>
<title>タイトルだよ</title>
<link>http://www.####.html
</link>
<description>Summary for """"</description>
<language>ja</language>
<item>
<title>項目1</title>
<link>00.xml</link>
</item>
<item>
<title>項目2</title>
<link>01.xml</link>
</item>
<item>
<title>項目3</title>
<link>02.xml</link>
</item>
<item>
<title>項目4</title>
<link>03.xml</link>
</item>
</channel>
です
です。[0]の所を変数にしてforでくくったらどうかとおもっているのですが、例えば[a]にしてfor(a=0; a<=2; a++){ }でくくると
どうしてもundefinedとでてしまいます。neta0.xmlの所はneta[a].xml としました。xmlはneta0.xml,neta1.xml,neta2.xmlとしています。
まだまだflashにしてもxmlにしても初心者ですがよろしくお願いします。
パースの仕方というよりもパース後のデータの持ちかたが
ややこしいから、ややこしくなってるんじゃないかと思います。
channel内のデーターを個別の配列としてもつんじゃなくて
channel1つを1つのオブジェクトとして、そのオブジェクトの配列(3つ?)を
持つというほうが簡単に済むんじゃないかと思います。
xml自体の解析は単純ですよね?4つヘッダーがあってその後
itemが任意の個数だから、firstChild.childNodesをばーっとみていくだけでいいと思いますよ。
例えばデータロード後のコールバックも入れるとこんな感じでは
どうですか?
_root.channels = [{}, {}, {}];
loadChannel('neta0.xmll', _root.channels[0]);
//laodChannel('neta1.xml',_root.channels[1]);
function loadChannel(xmlFile:String, obj:Object) {
var x:XML = new XML();
x.ignoreWhite = true;
var owner = this;
x.load(xmlFile);
x.onLoad = function(success) {
owner.parseChannel(this, obj);
};
}
function parseChannel(x:XMLNode, obj:Object) {
var channel:Array = x.firstChild.childNodes;
// headerのパース
obj['channelTitle'] = getValue(channel[0]);
obj['channelLink'] = getValue(channel[1]);
obj['channelDescription'] = getValue(channel[2]);
obj['channelLang'] = getValue(channel[3]);
// itemのパース
var o = obj['items']=[];
for (var i = 4; i<channel.length; i++) {
var items:Array = channel[i].childNodes;
var item:Object = {};
item['title'] = getValue(items[0]);
item['link'] = getValue(items[1]);
o.push(item);
}
//ロード後のコールバックの例
printChannel(obj);
//
}
function getValue(xm:XMLNode) {
return xm.firstChild.nodeValue;
}
//ロード後のコールバックの例(xmlファイルの内容を表示)
function printChannel(channel:Object){
trace(channel.channelTitle);
trace(channel.channelLink);
trace(channel.channelDescription);
trace(channel.channelLang);
for(var i=0;i<channel.items.length;i++){
trace(channel.items[i].title);
trace(channel.items[i].link);
}
}
//
----------------
- yo