トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     xmlの読み込みの変数化
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
afroman
Åê¹ÆNo.11279
投稿日時: 2004-10-4 13:28
新米
居住地: 関西
投稿: 4
使用環境:
MAC OSX10.3 Flash MX2004
xmlの読み込みの変数化
はじめまして。いつも見て参考にさせてもらっています。
さて、現在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にしても初心者ですがよろしくお願いします。
関たかまさ
Åê¹ÆNo.11281
投稿日時: 2004-10-4 13:52
常連
居住地: 埼玉
投稿: 61
使用環境:
WinXP Pro(sp1)
FlashMX 2004 Pro 7.2
Re: xmlの読み込みの変数化
こんにちわ。

XMLの操作だったら、forのループよりもwhileでnodeを見た処理が良いと思います。
たとえば。。。


var node = パースしたXML;

while(node){
  var child_node = node.firstChild;

  while(child_node){
    ary_0.addItem(child_node.nodeValue);
    ....
    child_node = child_node.nextSibling;
  }

  node = node.nextSibling;
}

みたいな感じですかね。

あとはXMLのデータですが、ループしない部分とする部分をひとくくりにしないで大きな2つのノードにするとわかりやすいかもしれませんね

それとこれはあくまでも経験上の話ですが、FlashのActionScriptのパーサーはちょっと他のネイティブ系なものより処理が重めでノードの階層が深いとちょっともたつき感がありました。
階層をあまり使わないで属性だと結構早く処理してくれましたよ
ご参考になればいい情報でした。
関たかまさ
Åê¹ÆNo.11283
投稿日時: 2004-10-4 14:19
常連
居住地: 埼玉
投稿: 61
使用環境:
WinXP Pro(sp1)
FlashMX 2004 Pro 7.2
Re: xmlの読み込みの変数化
ごめんなさい、書き忘れです。

引用:
さて、現在xmlを読み込ませてるのですが、xmlのファイルが複数
あり、それを順番に表示さたいと思っています。
現状はそれぞれのxmlを異なる変数にして読み込ませてるのですが
これをもうちょっと効率よく1つのスクリプトで1つの数値をかえるだけでなんとかならないかと画策してる所です。

この問題ですが、内部構造が一緒であればXMLオブジェクトの変数を定義してappendChildで追加していけば良いじゃないでしょうか?
それだったら前回レスのようにwhileでまわせると思います。

あと、[0]みたいに処理できるかどうかはデバッガで一度どのように変数がストアされているかのぞいてみてはどうでしょう?
きっとすぐにわかると思いますよ
afroman
Åê¹ÆNo.11284
投稿日時: 2004-10-4 15:01
新米
居住地: 関西
投稿: 4
使用環境:
MAC OSX10.3 Flash MX2004
ちょっと説明不足でしたでしょうか(^^;)
お早い返答ありがとうございます。
引用:
XMLの操作だったら、forのループよりもwhileでnodeを見た処理が良いと思います。

ちょっと説明不足だったのですが 、xmlは操作というより単純に読み込むだけなのです。xmlの書き出しは別から書き出しています。
読み込むだけでもwhileの方がいいのでしょうか?また、今回の場合、whileとfor、どちらも同じかなと思ったのですが、その場合はwhileの方がよいのでしょうか?
引用:

引用:
さて、現在xmlを読み込ませてるのですが、xmlのファイルが複数
あり、それを順番に表示さたいと思っています。
現状はそれぞれのxmlを異なる変数にして読み込ませてるのですが
これをもうちょっと効率よく1つのスクリプトで1つの数値をかえるだけでなんとかならないかと画策してる所です。

この問題ですが、内部構造が一緒であればXMLオブジェクトの変数を定義してappendChildで追加していけば良いじゃないでしょうか?
それだったら前回レスのようにwhileでまわせると思います。

あと、[0]みたいに処理できるかどうかはデバッガで一度どのように変数がストアされているかのぞいてみてはどうでしょう?
きっとすぐにわかると思いますよ

appendChildは読み込みだけの時にもつかえるのでしょうか?
一応変数にした場合のも乗せておきます。
_root.neta[0].ignoreWhite = true;
_root.neta[1].ignoreWhite = true;
_root.neta[2].ignoreWhite = true;
_root.neta[0].load("neta0.xml");
_root.neta[1].load("neta1.xml");
_root.neta[2].load("neta2.xml");
for (i=0; i<=2; i++) {
_root.neta[i].onLoad = function(success) {
// xml解析
if (success) {
_root.neta[i].parseXML(neta);
_root.title[i] = _root.neta[i].firstChild.firstChild.firstChild.firstChild.nodeValue;
_root.link[i] = _root.neta[i].firstChild.firstChild.firstChild.firstChild.nodeValue;
_root.des[i] = _root.neta[i].firstChild.firstChild.firstChild.nextSibling.nextSibling.nodeValue;
_root.lang[i] = _root.neta[i].firstChild.firstChild.firstChild.nextSibling.nextSibling.nextSibling.firstChild.nodeValue;
_root.item[i][0] = _root.neta[i].firstChild.firstChild.firstChild.nextSibling.nextSibling.nextSibling.nextSibling;
for (j=1; j<=3; ji++) {
_root.item[i][j] = _root.item[i][j-1].nextSibling;
}
for (j=0; j<=3; j++) {
_root.neta_array[i][j] = _root.item[i][j].firstChild;
_root.Vneta_array[i][j] = _root.neta_array[i][j].firstChild.nodeValue;
_root.link_array[i][j] = _root.item[i][j].lastChild;
_root.Vlink_array[i][j] = _root.link_array[i][j].firstChild.nodeValue;
}
}
}
}

っというふうにしてます。
_root.neta[0].ignoreWhite = true;
_root.neta[0].load("neta0.xml");
の部分も置き換えたいのですが、neta0.xmlの部分をさらに変数で読み込もうとするとさらにscriptが増えそうなので今回は省きました。
xmlの中身は同じ構成でテキスト内容が違うだけだと思ってください。
youich
Åê¹ÆNo.11285
投稿日時: 2004-10-4 15:26
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: xmlの読み込みの変数化
引用:

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

関たかまさ
Åê¹ÆNo.11286
投稿日時: 2004-10-4 15:46
常連
居住地: 埼玉
投稿: 61
使用環境:
WinXP Pro(sp1)
FlashMX 2004 Pro 7.2
Re: ちょっと説明不足でしたでしょうか(^^;)
なんかヘンテコな返答しちゃったかもしれないですね

引用:
読み込むだけでもwhileの方がいいのでしょうか?また、今回の場合、whileとfor、どちらも同じかなと思ったのですが、その場合はwhileの方がよいのでしょうか?

これについては、意見が分かれるところかもしれないです。
ただ、whileの方が早いっていうのも聞いたことがあったし(スイマセン、自分では検証してません)チェック自体も楽チンなので。
楽チンっていうのはノードが何個あっても大丈夫って意味です。

引用:
xmlの中身は同じ構成でテキスト内容が違うだけだと思ってください。

という事であれば、ひとつメソッドを作ってあげるのはどうでしょうか?
var ary = ["a.xml","b.xml","c.xml"];
var len = ary.length;
var channel_count = 0;

for(var i = 0;i < len;i++){
  loadXMLFunction(ary[i]);
}

function loadXMLFunction(str){
  var tmp_xml = new XML();
  var funcOwner = this;

  tmp_xml.ignoreWhite = true;
  tmp_xml.load(str);
  tmp_xml.onLoad = function(success){
    this.parseXML_data(this);
  }
}

function parseXML_data(node){
  var tmp = new Object();

  //ここはデータにあわせてセット
  tmp["title"] = ...

  _level0["channel_"+channel_count++] = tmp;
}

みたいな感じかなぁ。。。

もし、属性でデータを表現したら
<title>タイトルだよ</title>
<link>http://www.####.html
</link>
<description>Summary for """"</description>
<language>ja</language>
↓↓↓
<header title='タイトルだよ' link='http://www.####.html' description='Summary for """"' language='ja'>

これを上記のparseXML_dataで処理したら・・・

var atr_ary = ["title","link","description","language"];
var ary_len = atr_ary.length;
var obj = new Object();

for(var i = 0;i < ary_len;i++){
  obj[atr_ary[i]] = node.attributes[atr_ary[i]];
}

こんな事もできると思います。
afroman
Åê¹ÆNo.11293
投稿日時: 2004-10-4 19:11
新米
居住地: 関西
投稿: 4
使用環境:
MAC OSX10.3 Flash MX2004
Re: xmlの読み込みの変数化
なるほどー。わかりました.
なんとかこれでいけると思います。
下手にrootにおいたのも敗因の1つだったんですかね^^;
やってみます?。
まだまだ初心者なのでわからないことがこれからもたくさん出ると思いますのでまた質問など多々させてもらいますー。
ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops