Actionscript 3 — синтаксический анализ значений XML

#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