2011-01-17 6 views
0

Dies entspricht meiner vorherigen Frage. Ich bekam keine Antwort, vielleicht änderte ich die Frage, vielleicht bekam ich eine Antwort.NSXMLParser-Werte werden nicht beibehalten

Hier ist mein Parsing-Code:

-(void) parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName 
              namespaceURI:(NSString *) namespaceURI 
             qualifiedName:(NSString *) qName 
              attributes:(NSDictionary *) attributeDict 
{ 
    if ([elementName isEqualToString:kimgurl] 
     || [elementName isEqualToString:kone_x] 
     || [elementName isEqualToString:kone_y] 
     || [elementName isEqualToString:kone_radius] 
     || [elementName isEqualToString:ktwo_x] 
     || [elementName isEqualToString:ktwo_y] 
     || [elementName isEqualToString:ktwo_radius]) 
    { 
     elementFound = YES; 
     theItems = [[Items alloc] init]; 
    } 
} 


- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
             namespaceURI:(NSString *)namespaceURI 
            qualifiedName:(NSString *)qName 
{ 
    if([elementName isEqualToString:kimgurl]) 
    { 
     theItems.imageURL = self.currentValue; 
     [self.currentValue setString:@""]; 
    } 

    else if([elementName isEqualToString:kone_x]) 
    { 
     theItems.iOne_X = self.currentValue; 
     [self.currentValue setString:@""]; 
    } 

    else if([elementName isEqualToString:kone_y]) 
    { 
     theItems.iOne_Y = self.currentValue; 
     [self.currentValue setString:@""]; 
    } 

    else if([elementName isEqualToString:kone_radius]) 
    { 
     theItems.iOne_Radius = self.currentValue; 
     [self.currentValue setString:@""]; 
    } 

    else if([elementName isEqualToString:ktwo_x]) 
    { 
     theItems.iTwo_X = self.currentValue; 
     [self.currentValue setString:@""]; 
    } 

    else if([elementName isEqualToString:ktwo_y]) 
    { 
     theItems.iTwo_Y = self.currentValue; 
     [self.currentValue setString:@""]; 
    } 

    else if([elementName isEqualToString:ktwo_radius]) 
    { 
     theItems.iTwo_Radius = self.currentValue; 
     [self.currentValue setString:@""]; 
    } 

} 

-(void) parserDidEndDocument:(NSXMLParser *)parser 
{ 
    NSLog(@"enddocument: %@", theItems.imageURL); 
} 


-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string 
{ 
    if (elementFound == YES) { 
     if(!currentValue) 
     { 
      currentValue = [NSMutableString string]; 
     } 

     [currentValue appendString: string]; 
    } 
} 

Als ich nach parserDidEndDocument bekommen. Die theItems-Klasse ist leer. Hier

ist Items.h

#import <Foundation/Foundation.h> 


@interface Items : NSObject { 
    @private 
    //parsed data 
    NSString *imageURL; 
    NSString *iOne_X; 
    NSString *iOne_Y; 
    NSString *iOne_Radius; 
    NSString *iTwo_X; 
    NSString *iTwo_Y; 
    NSString *iTwo_Radius; 
} 

@property (nonatomic, retain) NSString *imageURL; 
@property (nonatomic, retain) NSString *iOne_X; 
@property (nonatomic, retain) NSString *iOne_Y; 
@property (nonatomic, retain) NSString *iOne_Radius; 
@property (nonatomic, retain) NSString *iTwo_X; 
@property (nonatomic, retain) NSString *iTwo_Y; 
@property (nonatomic, retain) NSString *iTwo_Radius; 


@end 

hier ist Items.m

#import "Items.h" 


@implementation Items 
@synthesize imageURL; 
@synthesize iOne_X; 
@synthesize iOne_Y; 
@synthesize iOne_Radius; 
@synthesize iTwo_X; 
@synthesize iTwo_Y; 
@synthesize iTwo_Radius; 

-(void)dealloc 
{ 
    [imageURL release]; 
    [iOne_X release]; 
    [iOne_Y release]; 
    [iOne_Radius release]; 
    [iTwo_X release]; 
    [iTwo_Y release]; 
    [iTwo_Radius release]; 
    [super dealloc]; 
} 
@end 

hier ist mein RootViewController.h

#import <UIKit/UIKit.h> 

@class Items; 

@interface RootViewController : UIViewController <NSXMLParserDelegate> { 
    NSMutableData *downloadData; 
    NSURLConnection *connection; 

    BOOL elementFound; 
    NSMutableString *currentValue; 
    NSMutableDictionary *pictures; 

    //---xml parsing--- 
    NSXMLParser *xmlParser; 

    Items *theItems; 
    NSMutableArray *aItems; 

} 

@property (nonatomic, retain) Items *theItems; 
@property (nonatomic, retain) NSMutableArray *aItems; 
@property (nonatomic, retain) NSMutableString *currentValue; 

@property (nonatomic, retain) NSMutableData *downloadData; 
@property (nonatomic, retain) NSURLConnection *connection; 

@end 

XML-Datei Beispiel

<?xml version="1.0" encoding="utf-8"?> 
<data> 
    <test> 
     <url>url</url> 
     <one_x>83</one_x> 
     <one_y>187</one_y> 
     <one_radius>80</one_radius> 
     <two_x>183</two_x> 
     <two_y>193</two_y> 
     <two_radius>76</two_radius> 
    </test> 
</data> 
+1

Sie würden Ihre Chancen erhöhen, eine Antwort zu bekommen, indem Sie Ihren Code richtig formatieren und wenn möglich auf die relevanten Teile reduzieren. Das ist sehr schwer zu lesen. – omz

+1

Es sieht aus wie ein neues theItems wird jedes Mal erstellt, wenn ein Element gestartet wird, ersetzt das alte, aber ohne das alte zu behalten. Im Grunde genommen haben Sie also einen riesigen Speicherverlust, und wenn Sie fertig sind, zeigt theItems auf die Daten des letzten analysierten Elements. Ich nehme an, das ist nicht das, was Sie vorhaben. – spstanley

+0

Ich habe versucht, den Code in den Blöcken zu formatieren, aber für mich scheint es ziemlich schwierig. Wie auch immer, auch wenn ich die theItems in der viewDidLoad erzeuge, bekomme ich die gleichen Ergebnisse. – user574947

Antwort

1

Es sieht so aus, als gäbe es ein paar potentielle Probleme. In Ihrer didStartElement-Methode ordnen Sie ein neues Items-Objekt für jedes Element zu und initialisieren es. Vielleicht können Sie die Items init in Ihre Methode -parserDidStartDocument: verschieben. Wenn Sie init, sollte es auch mehr wie folgt aussehen:

Items * items = [[Items allok] init]; self.theItems = Artikel; [Artikel freigeben];

Dann haben Sie die richtige Retain-Anzahl, wenn Sie fertig sind.

Ich würde auch empfehlen, Ihre [email protected] so zu ändern, dass sie Kopie statt beibehalten werden. Der Code:

theItems.imageURL = self.currentValue; 
[self.currentValue setString:@""]; 

... tut nicht, was Sie denken. theItems.imageURL wird auf Ihren NSMutableString zeigen und dann löschen Sie den veränderbaren String direkt danach, dass imageURL auf einen leeren veränderbaren String zeigt. Nach allen anderen Iterationen zeigen alle auf denselben NSMutableString, der leer ist. Wenn Sie die zu kopierenden @property-Deklarationen ändern, wird imageURL auf eine unveränderliche NSString-Kopie des Inhalts von self.currentValue festgelegt.

+0

Vielen Dank. Das brachte mich einen Schritt näher. Zumindest weiß ich, was ich falsch gemacht habe. Danke nochmal. – user574947