2012-03-15 4 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); 
    } 

이 단지 배열의 각 위치에 한 번에 모든 질문에 구를 밀어 :

<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 개의 질문을 원했다. 각 질문을 구별하기 위해 question 태그의 id 속성을 사용하는 방법을 잘 모르겠습니다.

편집

:하지만 외부 그것의, 나는이 시도 및 I (2) processXML 함수 내에서 getQuestionAt를 사용하여 질문 텍스트를 액세스 할 수 있습니다.

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

프레임이 하나 뿐인 새 레이어를 만들고 전체 프레임 (예 : 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]; 
}  

는 그런 다음 processXML 기능에

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을 다음 줄을 추가합니다. 모든 프레임에서 '표시'되기 때문에이 함수를 모든 프레임에서 호출 할 수 있습니다.

+0

가 어떻게이 FLA에 다른 프레임에서 질문 중 하나에 액세스합니까? 프레임 6에 ** text_txt.htmlText = getQuestionAt (2); **가있는 텍스트 필드를 채우려고했으나 작동하지 않습니다. – Livi17

+0

하나의 프레임 만있는 새 레이어를 만들고 전체 프레임 (예 : 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> 

그런 다음 속성을 부여하십시오.

var questions:XMLList = new XMLList(e.target.data.question) 
for each (var question:XML in questions){ 
    trace([email protected]) 
} 
+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를 그대로 사용할 수 있습니다. 당신의 완전한 목표는 무엇입니까?

난 그냥 조금 더 신중하게 질문을보고, 당신은 정말해야 할 일은 이것이다 :

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를 매일 사용하고 있기 때문에 완전히 이해할 수 있습니다). –