إضافة/إزالة من XMLList أثناء التكرار الحلقي
-
06-07-2019 - |
سؤال
أحاول تحليل بعض ملفات XML التي قمت باستعادتها عبر e4x في خدمة HTTP.تعمل الحلقة، ولكل حلقة في القائمة تمر عبر الحلقة.ومع ذلك، أحصل على الخطأ التالي عندما أحاول الإلحاق بقائمة XMLList.
TypeError: Error #1009: Cannot access a property or method of a null object reference.
أحاول الاستعلام عن قاعدة بيانات SQLite المحلية ومعرفة ما إذا كانت الحلقة موجودة (تعمل) وما إذا كانت تُلحق بقائمة xml واحدة وإذا لم تكن كذلك، يتم إلحاقها بقائمة xml الأخرى.
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);
}
المحلول
ولقد أعلن 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()
.
نصائح أخرى
هذا هو الحل الخاص بي ل إضافة عقد XML إلى قائمة XML ديناميكيا.
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);
}
}
ولكن إذا كنت تريد العمل مع 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);
}