2009-10-28 2 views
2

HTTPService에서 e4x를 통해 가져온 일부 XML을 구문 분석하려고합니다. 루프가 작동하고 목록의 각 에피소드마다 루프를 통과합니다. 그러나 XMLList에 추가하려고하면 다음과 같은 오류가 발생합니다. 루프 중에 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

당신은 episodeNewTepisodeWatchedT을 선언 한,하지만 당신은 아직 인스턴스화하지 않았습니다. 런타임시 수정하기가 쉽기 때문에 XMLList 대신 XMLListCollection을 사용하는 것이 좋습니다.

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(); 

은 이제 변수가 null되지 않습니다, 당신은 그들에 추가 할 수 있습니다

이보십시오. 은 copy()을 사용하여 모두 끝나면 XMLList으로 다시 변환됩니다.

+0

이것은 NULL 문제를 해결 한 것으로 보이지만 이제는 목록이 비어 있다는 또 다른 오류가 발생합니다. TypeError : 오류 # 1086 : appendChild 메서드는 하나의 항목을 포함하는 목록에서만 작동합니다. – medoix

+1

네 말이 맞아. XMLList 용 Flex 문서를 보면 appendChild() 메서드가 없다는 것을 알 수 있습니다. 그러나 XML 데이터 유형 DOES에는 appendChild() 메소드가 있습니다. 여기서 일어나는 일은 Flex가 당신을 도우려고한다는 것입니다. 컴파일러는 마치 하나의 XML 요소와 이야기하는 것처럼 XMLList에 대해 호출 할 수있게 해줄 것입니다. 그러나 실제로는 런타임시에만 작동합니다. 명부. 대신 어쨌든 더 나은 지원을 제공하는 XMLListCollection 만 사용하십시오. –

+0

전설! 고마워요. 다른 문제가 생겼지 만 이유를 이해하고 그 문제를 해결할 것입니다. – medoix

0

하지만 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); 
} 
1

추가 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); 
     } 
}