XML - атрибут узла таргетинга, вставить в массив Flash AS3 - PullRequest
0 голосов
/ 16 марта 2012

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

<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(myXML.question.@txt);
        trace(questions);
    }

Это просто подталкивает все 9 вопросов сразу в каждую позициюмассив.Я хотел 1 вопрос на позицию массива.Я не уверен, как использовать атрибут id в теге вопроса для дифференциации каждого вопроса.

РЕДАКТИРОВАТЬ: Я попробовал это, и я могу получить доступ к текстам вопросов, используя 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) );


}

Ответы [ 3 ]

0 голосов
/ 16 марта 2012

Ваш 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 голосов
/ 16 марта 2012

То, что у вас есть, - это не XML, а XMLList, и это вполне приемлемо.

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

Это будет выглядеть примерно так:

var questionTxt:XMLList = yourQuestions.@txt;//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];
}

Однако, это похоже на большую работу даром, так как вы можете просто использовать 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 голосов
/ 16 марта 2012

Создайте новый слой, который имеет только один кадр, и сделайте длину этого кадра такой же, как и все ваши кадры (например, 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[item.@id] = item.@txt;
 }
}   

Звоните getQuestionAt всякий раз, когда вы хотите получить вопросы.Вы можете вызывать эту функцию в любом кадре, потому что она «видима» во всех кадрах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...