0

URLで取得したXMLファイルを解析しようとしています。次にXMLの各要素を解析し、それをobjetsというNSMutableDictionaryに追加しますが、何も使用せずにmyMutableDictionnaryをmyMutableArrayに追加しようとすると...

[myMutableArray count]は0を返し、[myMutableDictionarycount]は3//これは正しいです

変数を宣言したインターフェイスは次のとおりです。

@protocol XMLParserDelegate;//déclaration du delegate

@interface XMLParser : NSObject <NSXMLParserDelegate>// on adopte le délégate   NSXMLParserDelegate pour la classe
{
NSXMLParser *monParseur;
NSMutableArray *myMutablArray;

NSMutableDictionary *myMutableDictionary;

NSString *objetCourrant;
NSMutableString *journalCourrant;
NSMutableString *dateCourrant;
NSMutableString *descriptionCourrant;

id<XMLParserDelegate> delegate; //on déclare le délégate sous le nom de delegate
}
-(void)parseXMLByPath:(NSString*)chemin;

@property (nonatomic,retain) NSMutableArray *maTabledeJournals;
@property  (nonatomic,retain) id<XMLParserDelegate> delegate;

@end
@protocol XMLParserDelegate <NSObject>
-(void) parsingIsFinished;
@end

そして、これが私のパーサーを定義した場所です:

-(void)parserDidStartDocument:(NSXMLParser *)parser
{
 myMutableArray=[[NSMutableArray alloc] init];
NSLog(@"Started");
}
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{

if (objetCourrant) {
    objetCourrant=nil;
}    
objetCourrant=[elementName copy];

if([elementName isEqualToString:kJournal ])
{
    if(myMutableDictionary)
    {
        myMutableDictionary=nil;
    }
    if(journalCourrant)
    {
        journalCourrant=nil;
    }
    if(dateCourrant)
    {
        dateCourrant=nil;
    }
    if(descriptionCourrant)
    {
        descriptionCourrant=nil;
    }
    
    myMutableDictionary = [[NSMutableDictionary alloc] init];
    

    journalCourrant = [[NSMutableString alloc] init];
    dateCourrant = [[NSMutableString  alloc] init];
    descriptionCourrant = [[NSMutableString alloc] init];
    
    NSLog(@"is parsing...");
}

}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
  {

if([elementName isEqualToString:kJournal])
{
   
    [myMutableDictionary setObject:journalCourrant forKey:kTitre]; NSLog(@"%@",journalCourrant);
    [myMutableDictionary setObject:dateCourrant forKey:kDate];  NSLog(@"%@",dateCourrant);
    [myMutableDictionary setObject:descriptionCourrant forKey:kDescription]; NSLog(@"%@",descriptionCourrant);
    
    NSLog(@"my dictionary %i",[myMutableDictionary count]);
    
    [myMutableArray addObject:myMutableDictionary];
    
    NSLog(@"my array %i",[myMutableArray count]);
}

  }

ここで問題を引き起こしている可能性があるものについて何か考えはありますか?

解決

次のようにmyMutableDictionaryをmyMutableArrayに追加する代わりに:

[myMutableArray addObject:myMutableDictionary];

やった:

[self.myMutableArray addObject:myMutableDictionary];

そして今はすべてうまくいきます。助けてくれてありがとう!

4

2 に答える 2

2

コードが機能しない理由は、可変配列を初期化していないためです。

追加

myMutableArray = [[NSMutableArray alloc] init];

変数を初期化する場所

于 2012-04-24T13:06:15.227 に答える
0

他の回答とコメントを読みましたが、まだ問題があるようです。これを機能させるための最も基本的なコードは次のとおりです。

NSMutableArray * myArray = [[NSMutableArray alloc] init];
NSMutableDictionary * myDict = [[NSMutableDictionary alloc] init];
[myArray addObject:myDict];
NSLog(@"Count = %i", [myArray count]); // returns 1

@interfacemyMutableArray 変数を宣言した場所に投稿できますか?

また、次のような同じ行で 2 つの関数/メソッド呼び出しを行わないことをお勧めします。

[myMutableDictionary setObject:journalCourrant forKey:kTitre]; NSLog(@"%@",journalCourrant);
[myMutableDictionary setObject:dateCourrant forKey:kDate];  NSLog(@"%@",dateCourrant);
[myMutableDictionary setObject:descriptionCourrant forKey:kDescription]; NSLog(@"%@",descriptionCourrant);
于 2012-04-24T13:30:20.707 に答える