Делая редактор для игры наткнулся на такие вот грабли, которые убили пару часов моего времени ;) В моем случае редактор загружает и парсит xml-файл в массив, после чего он должен был находить индекс элемента в массиве, но функция indexOf() все время возвращала -1, что означало, что элемент не найден в массиве, после танцев с бубном я выяснил, что при выдергивании значения из аттрибута name возвращается не строка, а XMLList:
var xml:XML = <description> <data name="some name 1"/> <data name="some name 2" /> <data name="some name 3" /> </description> var arr:Array = []; for (var i:int = 0; i < xml.data.length(); i++) { arr[i] = xml.data[i].@name; trace(xml.data[i].@name is XMLList); // true trace(xml.data[i].@name is String); // false; } trace(arr.indexOf("some name 3")); // -1
Чтобы исправить это все надо было лишь явно преобразовать значение в строку:
var xml:XML = <description> <data name="some name 1"/> <data name="some name 2" /> <data name="some name 3" /> </description> var arr:Array = []; for (var i:int = 0; i < xml.data.length(); i++) { arr[i] = String(xml.data[i].@name); } trace(arr.indexOf("some name 3")); // 2
Столкнулся еще с одной проблемкой, когда задавал условие при выборке xml ничего не выводилось, хотя должен был выводиться 1 XMLList, проблему исправил тоже с приведением в строку, с помощью функции toXMLString():
XMLList( xml..item.(@name == "name").toXMLString() );
Вот такие вот грабельки, на которые в будущем, если столкнетесь, постараетесь обойти стороной :)
Ваш отзыв