as3 случайный доступ к XML-данным

#xml #arrays #actionscript-3

#xml #массивы #actionscript-3

Вопрос:

После чтения данных из источника XML мне нравится иметь возможность отображать один случайный элемент из данных всякий раз, когда, скажем, нажимается кнопка. Я думаю, что могу добиться этого, сохранив данные в массив и используя их из массива.
Я хотел бы узнать, если возможно, сделать это непосредственно из xml, не сохраняя его в другой массив. Заранее спасибо

 var myXMLLoader:URLLoader = new URLLoader();
myXMLLoader.load(new URLRequest("XML_NOTES.xml"));
myXMLLoader.addEventListener(Event.COMPLETE, processXML);


function processXML(e:Event):void {
            var loader:URLLoader = e.target as URLLoader;
            var myXML:XML = new XML(loader.data);
            for (i=0;i<2;i  ){
            trace(myXML.LEMMA[i]);
            array.push(myXML.LEMMA[i]);
            }

}
  

Ответ №1:

Вы можете сделать это непосредственно из переменной myXML, вам нужно будет установить myXML в качестве глобальной переменной:

 var myXML:XML;
var myXMLLoader:URLLoader = new URLLoader();
myXMLLoader.load(new URLRequest("XML_NOTES.xml"));
myXMLLoader.addEventListener(Event.COMPLETE, processXML);

function processXML(e:Event):void {
    var loader:URLLoader = e.target as URLLoader;
    myXML = new XML(loader.data);
}

function getRandomItem():XML {
    var elementsCount:int = myXML.LEMMA.length();
    var randomIndex:int = Math.floor( Math.random() * (elementsCount-1) );
    return myXML.LEMMA[randomIndex];
}
  

Комментарии:

1. Нужно ли мне использовать event.complete, чтобы не столкнуться с проблемой загрузки или нет

2. Да, это необходимо, потому что в этом случае вы получаете свой XML-контент.

3. Я отредактировал свой код, чтобы вы могли видеть, как все это может выглядеть

4. -1 Глобальные переменные, как правило, являются плохой практикой. Избегайте их любой ценой. В этом случае, наверняка, нет веской причины myXML быть глобальным.

5. @ Brian: Как мы можем получить доступ к данным, если myXML не является глобальным… Есть ли у вас какие-либо предложения, чтобы заставить его работать?

Ответ №2:

Если я правильно понял вопрос:

 function processXML(event:Event):void
{
    var myXML:XML = XML((e.target as URLLoader).data);
    var children:XMLList = myXML.*;
    trace(children[Math.random() * children.length()].toXMLstring());
}
  

Обратите внимание, что, хотя это называется XML List, на самом деле это массив, более того, это настоящий массив (плотный), в отличие от класса Array 🙂 (который представляет собой смесь массива и строкового хэша). Таким образом, нет проблем с доступом к элементу по индексу — нет необходимости преобразовывать в массив.