2012-03-15 3 views
0

Я пытаюсь вытолкнуть только содержимое атрибута «txt» в каждый тег «вопрос» в массив с именем «вопросы» в AS3 Flash. Вот выдержка из моего xml-файла.Атрибут узла таргетинга XML, нажимать на массив Flash AS3

<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> 

Вот моя попытка цикла:

// 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 вопросов сразу в каждой позиции массива. Я хотел 1 вопрос на позицию массива. Я не уверен, как использовать атрибут id в теге вопроса, чтобы различать каждый вопрос.

EDIT: Я попробовал это, и я могу получить доступ к вопросам текстов, используя getQuestionAt (2) внутри функции processXML, но не за его пределы.

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? Я попытался заполнить текстовое поле ** text_txt.htmlText = getQuestionAt (2); ** на кадре 6, и он не работает. – 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

Thats просто отрывок из xml, он имеет корневой узел и отформатирован правильно. Файл xml был слишком длинным и содержал слишком много нерелевантных данных, чтобы опубликовать все это. – Livi17

+0

Я пробовал это, но он дает следующую ошибку. TypeError: Ошибка # 1034: Ошибка типа Coercion: невозможно преобразовать Object @ 29328c41 в XMLList. – Livi17

0

Что вы имеете, это не XML, а XMLList, и это вполне приемлемо.

Вам не нужно проходить через петлю. Вы можете получить еще один XMLList. XMLList похож на массив XML, но в этом случае у вас не будут полностью сформированные узлы, а просто содержимое всех атрибутов.

Он будет идти что-то вроде этого:

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

Теперь вы можете получить доступ к любому текстовому элементу как:

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

Если по какой-то причине вы абсолютно необходимо иметь массив, вы можете сделайте следующее:

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

Однако, это похоже на много o f работает ни за что, так как вы можете просто использовать XMLList, поскольку он, обращаясь к нему с помощью e4x. Какова ваша цель?

Я просто посмотрел на свой вопрос немного более тщательно, и все, что вам действительно нужно сделать, это:

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 каждый день сейчас). –

Смежные вопросы