Добавить / удалить из XMLList в цикле - PullRequest
2 голосов
/ 28 октября 2009

Я пытаюсь проанализировать какой-то XML, полученный мной через e4x в HTTPService. Цикл работает и для каждого эпизода в списке проходит цикл. Однако я получаю следующую ошибку при попытке добавить в XMLList.

TypeError: Error #1009: Cannot access a property or method of a null object reference.

Я пытаюсь запросить локальную базу данных SQLite и посмотреть, существует ли эпизод (работает) и добавляется ли он в один список xmllist, а если нет, то добавляется в другой список xmllist.

public static function seasonFavHandler(evt:ResultEvent):void {
    Application.application.ManagePage.selectedShow = 
        Application.application.ManagePage.gridFavourites.selectedItem as XML;
    episodeNumber = XML(evt.result).descendants("episode");
    var episode:Object = episodeNumber;
    for each(episode in episodeNumber) {
        currentEpisode = episode as XML;
        achkStatement = new SQLStatement();
        achkStatement.sqlConnection = dbconnection;
        achkStatement.text = "select :episodename from episodes where episodename = :episodename";
        achkStatement.parameters[":episodename"] = episode.title;
        achkStatement.addEventListener(SQLEvent.RESULT, episodeHandler);
        achkStatement.execute();
        trace(episode.title);
    }
   //Application.application.ManagePage.episodeList = episodeNumber;
   seasonHttpService.removeEventListener(ResultEvent.RESULT, seasonFavHandler);
   CursorManager.removeBusyCursor();
}

private static function episodeHandler(event:SQLEvent):void {
    var result:SQLResult = achkStatement.getResult();
    var episodeNewT:XMLList;
    var episodeWatchedT:XMLList;
    if (!result.data) {
        episodeNewT.appendChild(currentEpisode);
        //Application.application.ManagePage.gridUnwatched.addChild(currentEpisode);
    } else {
        episodeWatchedT.appendChild(currentEpisode);
        //Application.application.ManagePage.gridWatched.addChild(currentEpisode);
    }
    Application.application.ManagePage.episodeNew = episodeNewT;
    Application.application.ManagePage.episodeWatched = episodeWatchedT;
    achkStatement.removeEventListener(SQLEvent.RESULT, episodeHandler);
}

Ответы [ 3 ]

3 голосов
/ 28 октября 2009

Вы объявили episodeNewT и episodeWatchedT, но еще не создали их экземпляры. Я бы также предложил вам использовать XMLListCollection вместо XMLList, поскольку его легче изменить во время выполнения.

Попробуйте это:

var episodeNewT:XMLListCollection = new XMLListCollection();
var episodeWatchedT:XMLListCollection = new XMLListCollection();

if (!result.data) {
    episodeNewT.addItem(currentEpisode);
} else {
    episodeWatchedT.addItem(currentEpisode);
}

Application.application.ManagePage.episodeNew = episodeNewT.copy();
Application.application.ManagePage.episodeWatched = episodeWatchedT.copy();

Теперь ваши переменные не будут нулевыми, и вы можете добавить к ним. Обратите внимание, что вы будете конвертировать XMLListCollection обратно в XMLList в конце всего этого, используя copy().

1 голос
/ 20 сентября 2013

это мое решение для динамического добавления узлов xml в xmllist .

private function addXmlChild(xmlList:XMLList, xmlNode:XML):void
{
    try
    {
        if(xmlList.children().length() != 0)
        {
            xmlList[xmlList.length() + 1] = xmlNode;
        }
        else
            xmlList[0] = xmlNode;               
        } 
        catch(error:Error) 
        {
            LogWriter.ErrorLog("addXmlChild, " + error.message);
        }
}
0 голосов
/ 24 октября 2010

Но если вы хотите работать с XMLList, вы можете попробовать следующее:

var episodeNewT:XMLList;
var episodeWatchedT:XMLList;
if (!result.data) {
    episodeNewT= XMLList(currentEpisode);
    //Application.application.ManagePage.gridUnwatched.addChild(currentEpisode);
} else {
    episodeWatchedT = XMLList(currentEpisode);
    //Application.application.ManagePage.gridWatched.addChild(currentEpisode);
}
...