#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 🙂 (который представляет собой смесь массива и строкового хэша). Таким образом, нет проблем с доступом к элементу по индексу — нет необходимости преобразовывать в массив.