0

Делая редактор для игры наткнулся на такие вот грабли, которые убили пару часов моего времени ;) В моем случае редактор загружает и парсит 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() );

Вот такие вот грабельки, на которые в будущем, если столкнетесь, постараетесь обойти стороной :)


Ваш отзыв