0
votes

So I am making an app that one part of it displays the users tweets in a table view. However there's something getting corrupted with some tweets such as its only showing a single character such as (") or an emoji character. In example if the tweet says:

RT @jakemillermusic: Everyone upload your pics that you took today during the ustream and caption it "follow @jakemillermusic #jakemiller"

when shown with NSLog it prints :


2013-04-03 00:34:30.476 ParsingXMLTutorial[3308:c07] RT @jakemillermusic: Everyone upload your pics that you took today during the ustream and caption it

2013-04-03 00:34:30.476 ParsingXMLTutorial[3308:c07] "

2013-04-03 00:34:30.477 ParsingXMLTutorial[3308:c07] follow @jakemillermusic #jakemiller

2013-04-03 00:34:30.478 ParsingXMLTutorial[3308:c07] "


Here's the URL I am using to fetch the XML format:

http://api.twitter.com/1/statuses/user_timeline/LexxiSaal.xml?include_entities=true&include_rts=true&screen_name=twitterapi&trim_user=false&contributor_details=true&count=50


HERES THE PARSING CODE:

-(id) loadXMLByURL:(NSString *)urlString
{
    _tweets         = [[NSMutableArray alloc] init];
    NSURL *url      = [NSURL URLWithString:urlString];
    NSData  *data   = [[NSData alloc] initWithContentsOfURL:url];
    parser          = [[NSXMLParser alloc] initWithData:data];
    parser.delegate = self;
    [parser parse];
    return self;
}

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    //string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];           // space
    string = [string stringByReplacingOccurrencesOfString:@"\n" withString:@""];    // newline
    string = [string stringByReplacingOccurrencesOfString:@"\t" withString:@""];


currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementname isEqualToString:@"status"]) 
    {
        currentTweet = [Tweet alloc];
        isStatus = YES;
}
if ([elementname isEqualToString:@"user"]) 
{
    isStatus = NO;
}
}

    - (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:    (NSString *)namespaceURI qualifiedName:(NSString *)qName
    {
        if (isStatus) 
        {
            if ([elementname isEqualToString:@"created_at"]) 
            {
                currentTweet.dateCreated = currentNodeContent;
            }
            if ([elementname isEqualToString:@"text"]) 
            {
                currentTweet.content = currentNodeContent;
            }
        }
    if ([elementname isEqualToString:@"status"]) 
    {
        [self.tweets addObject:currentTweet];
        currentTweet = nil;
        currentNodeContent = nil;
    }
}

@end
1
Put your parsing codeiphonic
there you go @iphonicPhil Scarf

1 Answers

0
votes

I would suggest few changes as below

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
     NSString *value=[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet];

     if(currentNodeContent == nil){
         currentNodeContent = [[NSMutableString alloc] initWithString:value];
     }else
         [currentNodeContent appendString:value];
}

and in didEnd

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:    (NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if (isStatus) 
    {
        if ([elementname isEqualToString:@"created_at"]) 
        {
            currentTweet.dateCreated = currentNodeContent;
        }
        if ([elementname isEqualToString:@"text"]) 
        {
            currentTweet.content = currentNodeContent;
        }
    }
    if ([elementname isEqualToString:@"status"]) 
    {
        [self.tweets addObject:currentTweet];
        currentTweet = nil;
        //currentNodeContent = nil; REMOVED
     }

    currentNodeContent = nil; // PUT OUTSIDE
}

The thing is you have to append string in method foundCharacters because the parser doesn't return all the string in between the tags at once..

And at last you should make the currentNodeContent nil, in the didEnd method globally because you are using it for other texts too.

Hope above helps..