Ajouter / Supprimer de XMLList en boucle
-
06-07-2019 - |
Question
J'essaie d'analyser du code XML récupéré via e4x dans un service HTTPS. La boucle fonctionne et pour chaque épisode de la liste, elle parcourt la boucle. Cependant, je reçois l’erreur suivante lorsqu’il essaie d’ajouter à une liste XML.
TypeError: Error #1009: Cannot access a property or method of a null object reference.
J'essaie d'interroger la base de données SQLite locale et de voir si l'épisode existe (fonctionne) et s'il ajoute à un xmllist et si non, à l'autre 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);
}
La solution
Vous avez déclaré episodeNewT
et episodeWatchedT
, mais vous ne les avez pas encore instanciés. Je vous recommanderais également d'utiliser XMLListCollection
au lieu de XMLList
, car il est plus facile de le modifier au moment de l'exécution.
Essayez ceci:
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();
Vos variables ne seront plus nulles et vous pourrez les ajouter. Notez que vous allez reconvertir XMLListCollection
en XMLList
à la fin, en utilisant copy ()
.
Autres conseils
C’est ma solution pour ajouter des nœuds XML à xmllist de manière dynamique.
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);
}
}
Mais si vous voulez travailler avec XMLList, vous pouvez essayer le suivant:
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);
}