2012-03-15 13 views
0

各 "question"タグの "txt"属性の内容をAS3 Flashの "questions"という配列にプッシュしようとしています。ここに私のXMLファイルからの抜粋です。XMLターゲティングノード属性、Flash AS3配列にプッシュ

// get number of questions 
    trace(myXML.question.length()); 
    numberOfQuestions = myXML.question.length(); 

    //loop and push questions into questions array at top 
    for (var i:int = 0; i < numberOfQuestions; i++) { 
     trace("Hello."); 
     questions.push([email protected]); 
     trace(questions); 
    } 

これは単なる配列の各位置に一度に全ての質問9をプッシュ:

<question id='Q1' uId='99036' no_ans='2' txt='In a flat structure employees are not expected to provide their bosses with their opinions.' feedback='' type='MC' passingWeight='1' url='media/'> 
    <answer id='Q1A1' uId='311288' txt='True' weight='0'/> 
    <answer id='Q1A2' uId='311289' txt='False' weight='1'/> 
</question> 
<question id='Q2' uId='99037' no_ans='2' txt='In a hierarchy, information typically flows downward.' feedback='' type='MC' passingWeight='1' url='media/'> 
    <answer id='Q2A1' uId='311290' txt='True' weight='1'/> 
    <answer id='Q2A2' uId='311291' txt='False' weight='0'/> 
</question> 
<question id='Q3' uId='99038' no_ans='2' txt='Someone who keeps many projects going at one time is an example of someone who is flexible-time oriented.' feedback='' type='MC' passingWeight='1' url='media/'> 
    <answer id='Q3A1' uId='311292' txt='True' weight='1'/> 
    <answer id='Q3A2' uId='311293' txt='False' weight='0'/> 
</question> 

はここでループでの私の試みです。配列の位置ごとに1つの質問が必要でした。質問タグのid属性を使用して各質問を区別する方法がわかりません。

EDIT:私はこれを試してみましたが、私はprocessXML関数内からではなく、それ以外でgetQuestionAt(2)を使用して質問テキストにアクセスすることができます。

var myXML:XML; 
var myLoader:URLLoader = new URLLoader(); 
myLoader.load(new URLRequest("html/VUBZ7318CROSSCULTUREQUIZ/manifest.xml")); 
myLoader.addEventListener(Event.COMPLETE, processXML); 
function processXML(e:Event):void { 
    myXML = new XML(e.target.data); 

    //trace(myXML.question) 

    // get number of questions 
    trace(myXML.question.length()); 
    numberOfQuestions = myXML.question.length(); 

    //Question list 
    var questions:Object = {}; 
    //Extracting question from xml 
    for each (var item:XML in myXML.question) { 
     questions[item. @ id] = item. @ txt; 
    } 
    //Some method for fetching question from question list 
    function getQuestionAt(index:Number):String { 
     if (questions["Q" + index] == undefined) { 
      throw new Error("Wrong index for question!!!"); 
     } 
     return questions["Q"+index]; 
    } 

    //Getting question from list 
    trace("Here is question No 2:\t" + getQuestionAt(2)); 


} 

答えて

0

1つのフレームのみを持つ新しいレイヤーを作成し、そのフレームの長さを合計フレーム(たとえば、6の長さ)にします。次に、このコードをそのフレームに入れます。

//Question list 
var questions:Object; 
//Some method for fetching question from question list 
function getQuestionAt(index:Number):String{ 
    if(questions["Q"+index] == undefined){ 
     throw new Error("Wrong index for question!!!"); 
    } 
    return questions["Q"+index]; 
}  

その後

function processXML():*{ 
//.....Your 'myXML' is here.... 
questions = {}; 
//Extracting question from xml 
for each(var item:XML in myXML.question){ 
    questions[[email protected]] = [email protected]; 
} 
} 

コールgetQuestionAtあなたが質問を取得したい時はいつでもあなたのprocessXML関数にこれらの行を追加します。その関数はどのフレームでも呼び出すことができます。これは、すべてのフレームで '可視'になっているためです。

+0

? フレーム6に** text_txt.htmlText = getQuestionAt(2); **というテキストフィールドを設定しようとしましたが、動作しません。 – Livi17

+0

新しいレイヤーを作成します。新しいレイヤーは1つのフレームだけを作成し、そのフレームの長さは、フレーム全体の長さにします(たとえば6を長くします)。そのフレームにASコードを追加します。その場合、すべてのフレームで「可視」なので、関数を任意のフレームで呼び出すことができます。 – Engineer

+0

私はあなたの提案を試みましたが、まだ動作しません...あなたのコードを** processXML()**関数の中に入れているからですか?上記の私の編集を参照してください。それは関数内では動作しますが、外部ではなく、flaのどこからでも動作します。 – Livi17

0

あなたはXMLがちょっとだけ間違って設定されています。 AS3では、ルートノードが必要です。ルートノードにアクセスできないのは単なるラッパーです。あなたのケースでは、アクセスできないルートノードが疑問です。これらの属性にもアクセスできないようにします。だからあなたのXMLの周りにラッパーを置く。私は間違ってルートノードの属性にアクセスすることができない可能性がありますが、私はあなたのXMLが適切ではないのは正しいです。そして、ラッパーを追加するだけで簡単になります。

<questions> 
    <question id='Q1' uId='99036' no_ans='2' txt='In a flat structure employees are not expected to provide their bosses with their opinions.' feedback='' type='MC' passingWeight='1' url='media/'> 
     <answer id='Q1A1' uId='311288' txt='True' weight='0'/> 
     <answer id='Q1A2' uId='311289' txt='False' weight='1'/> 
    </question> 
    <question id='Q2' uId='99037' no_ans='2' txt='In a hierarchy, information typically flows downward.' feedback='' type='MC' passingWeight='1' url='media/'> 
     <answer id='Q2A1' uId='311290' txt='True' weight='1'/> 
     <answer id='Q2A2' uId='311291' txt='False' weight='0'/> 
    </question> 
    <question id='Q3' uId='99038' no_ans='2' txt='Someone who keeps many projects going at one time is an example of someone who is flexible-time oriented.' feedback='' type='MC' passingWeight='1' url='media/'> 
     <answer id='Q3A1' uId='311292' txt='True' weight='1'/> 
     <answer id='Q3A2' uId='311293' txt='False' weight='0'/> 
    </question> 
</questions> 

次に、そのように属性を取得します。

+0

また、 "NEST"機能は決して悪いことではありません。 –

+0

xmlの抜粋だけですが、ルートノードがあり、適切にフォーマットされています。 xmlファイルが長すぎて、あまり関係のないデータが含まれているため、すべてを投稿できません。 – Livi17

+0

これを試しましたが、次のエラーが発生します。 TypeError:エラー#1034:型変換が失敗しました:Object @ 29328c41をXMLListに変換できません。 – Livi17

0

あなたが持っているものは、XMLではなくXMLListです。これは完全に受け入れられます。

ループする必要はありません。このように別のXMLListを取得できます。 XMLListはXMLの配列に似ていますが、この場合、完全に形成されたノードではなく、すべての属性の内容だけが表示されます。それはこのようなものになります

:あなたは絶対に何らかの理由をすることができます、配列を持っている必要があります場合は

var stem:String = String(questionTxt[0]); 

:今

var questionTxt:XMLList = [email protected];//yourQuestions contains your originalXMLList as shown above 

を、あなたは、各テキスト要素にアクセスすることができますこれを行う:

var questions:Array = new Array(); 
for (var i:int = 0; i< questionTxt.length(); i++) { 
    questions[i] = questionTxt[i]; 
} 

ただし、 fは何の役にも立ちません.e4xでXMLListにアクセスするだけでXMLListをそのまま使用することができます。あなたの完全な目標は何ですか?

私はもう少し慎重にあなたの質問を見て、そしてあなたが本当にする必要があるすべてはこれです:私はFLAの異なるフレームからの質問のいずれかにアクセスするにはどうすればよい

protected var questions:XMLList; 
public function processXML(e:Event):void { 
      myXML = XML(e.target.data); 
      questions = myXML.question; 

      // get number of questions 
      trace(myXML.question.length()); 
} 

public function getQuestionAt(index:Number):String { 
      if (questions[index] == undefined) { 
       throw new Error("Wrong index for question!!!"); 
      } 
      return questions[index].attribute('txt'); 
}  

public function get numberOfQuestions():int { 
    return myXML.question.length(); 
} 
+0

クライアントが購入したクイズゲームがフラッシュ http://elearningbrothers.com/product_demos/004_flashgames/002_gameshowdemo/demo.htm ダイナミックにしようとしています...現在は動的ではありません。私はすべてを再現したくありません。 CMSは現在、xmlファイルにクイズの質問を生成します。最初のフレームで質問と回答を読み込んで、FLAファイル全体の他のフレームにアクセスできるようにするだけです。私は外部の.asファイルを使用することはできないので、すべてのコードが最も内部的なものになります。 – Livi17

+0

ファイルとして使用できない原因は何ですか?しかし、そうであっても、フレームスクリプトで作業するように私があなたに与えたものを変更することができます(私は毎日AS2を行っているので、完全に入手できます)。 –