#actionscript-3
#actionscript-3
Вопрос:
У меня есть следующий XML:
<document>
<homeitems>
<homeitem>
<itemURL>URL1.html</itemURL>
</homeitem>
<homeitem>
<itemURL>URL2.html</itemURL>
</homeitem>
<homeitem>
<itemURL>URL3.html</itemURL>
<itemImage>image3.jpg</itemImage>
</homeitem>
</homeitems>
</document>
И следующий код, который анализирует его:
var XMLData:XML = new XML(LoaderMax.getContent("xmlDoc")); // loads XML
var numitems = XMLData.homeitems.homeitem.length();
for (var i=0;i<numitems;i ) {
if ((XMLData.homeitems.homeitem[i].itemImage) amp;amp; (XMLData.homeitems.homeitem[i].itemImage!=="")) {
trace("Loading image " XMLData.homeitems.homeitem[i].itemImage);
}
}
Результат трассировки:
Loading image
Loading image
Loading image image3.jpg
ПОЧЕМУ ?!?!? Разве он не должен пропускать элементы, у которых нет изображений? Я глупый?
Ответ №1:
Вы можете видеть, что ваш тест if (XMLData.homeitems.homeitem[i].itemImage)
оценивается как true (просто сделайте trace(Boolean(XMLData.homeitems.homeitem[i].itemImage)
, и вы увидите true).
Также не сравнивайте узел с a String
используйте toString
метод узла или явно преобразуйте его в a String
(т. Е. String(XMLData.homeitems.homeitem[i].itemImage)!=""
Или XMLData.homeitems.homeitem[i].itemImage.toString()!=""
)
Для этого есть несколько способов :
Вы можете проверить, не определен ли узел :
if (XMLData.homeitems.homeitem[i].itemImage != undefined)
Используйте метод hasOwnProperty :
if (XMLData.homeitems.homeitem[i].hasOwnProperty('itemImage'))
И вы также можете привести свой itemImage
к строке и посмотреть, является ли она != ""
:
if (String(XMLData.homeitems.homeitem[i].itemImage) != "")
Используя e4x и foreach, вы можете получить более чистый код для своего цикла :
for each(var homeItem:XML in XMLData.homeitems.homeitem) {
var itemImage:String = String(homeItem.itemImage)
if (itemImage!="") {
trace("Loading image " itemImage);
}
}
Ответ №2:
Этого достаточно, если вы сравниваете с !=
не !==
if ((XMLData.homeitems.homeitem[i].itemImage) amp;amp; (XMLData.homeitems.homeitem[i].itemImage!="")) {
/* do somethong here */
}
Комментарии:
1. Хорошо, но это ничего не меняет. Вывод все тот же
2. Попробуйте
XMLData.homeitems.homeitem[i].itemImage != NULL amp;amp; XMLData.homeitems.homeitem[i].itemImage != ""
3. 1120: доступ к неопределенному свойству NULL, должно быть в нижнем регистре null… но по-прежнему никаких изменений — условие по-прежнему оценивается как true