0

そのため、ユーザーのツイートを表形式で表示するアプリを作成しています。ただし、(") や絵文字などの単一の文字のみを表示するなど、一部のツイートで何かが破損していることがあります。ツイートの例:

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

NSLog で表示すると、次のように出力されます。


2013-04-03 00:34:30.476 ParsingXMLTutorial[3308:c07] RT @jakemillermusic: ustream で今日撮った写真をみんなでアップロードしてキャプションを付けて

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

2013-04-03 00:34:30.477 ParsingXMLTutorial[3308:c07] @jakemillermusic #jakemiller に従ってください

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


XML 形式を取得するために使用している URL は次のとおりです。

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


解析コードは次のとおりです。

-(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
4

1 に答える 1

0

以下のようにいくつかの変更をお勧めします

- (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];
}

そして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
}

問題は、パーサーがタグ間のすべての文字列を一度に返すわけではないため、foundCharacters メソッドに文字列を追加する必要があることです。

最後に、他のテキストにも使用しているため、グローバルに didEnd メソッドでcurrentNodeContentを nil にする必要があります。

上記の希望が役立ちます..

于 2013-04-04T04:34:10.190 に答える