2

私は人のリストを解析し、名前でUITableViewを汚染しようとします。しかし、私が解析したい人は特殊文字(ä、ö、ü)を持っています。ここで、「Gött」という名前の構文解析を開始すると、後で「ött」になります。本当に奇妙な、何かアイデアはありますか?どうもありがとう!

-(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 didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementname isEqualToString:@"lehrer"]) 
    {
        currentTweet = [Tweet alloc];
    }
}

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

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

- (void) dealloc
{
    [parser release];
    [super dealloc];
}

@end
4

2 に答える 2

3

これは正常な動作です。parser:foundCharactersは、1つの文字列に対して複数回呼び出すことができます(アクセント付きの文字に対して呼び出される傾向があります)。文字列は要素の終わりまで完成しないので、それらを保存し、ブロックの終わりに到達したときに完全な文字列を使用します。これはfoundCharactersのドキュメントにあります

NSXMLParserに関するAppleデベロッパドキュメント

パーサーオブジェクトは、要素の文字を報告するために、デリゲートにいくつかのparser:foundCharacters:メッセージを送信する場合があります。文字列は現在の要素の合計文字コンテンツの一部にすぎない可能性があるため、要素が変更されるまで、文字列を現在の文字の累積に追加する必要があります。

質問に従って編集します。

コードは一般的には問題ありませんが、文字関数では、

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if(nil == currentNodeContent)
        currentNodeContent = [[NSMutableString alloc] initWithString:string];
    else
        [currentNodeContent appendString:string];
}

次に、didStartとdidEndの両方で、文字列がnilであるかどうかを確認するメソッドを呼び出し、最初に文字列で実行しようとしていたことをすべて実行してから、文字列を解放します(そしてnullにします)。

文字列は、新しい要素の開始(つまり、開始<の前のテキスト)と終了(前のテキストのビット)の両方で終了します。

于 2012-04-30T20:13:09.610 に答える
3

ウッディの答えによると、これは完全に予想されます。- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string複数の呼び出しからの文字列を連結する必要があります。

これを行う正しい方法は次のとおりです。

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if (currentElementContent== nil)
        currentElementContent = [[NSMutableString alloc] initWithString:string];
    else
        currentElementContent = [currentElementContent stringByAppendingString:string];
}

とにかく、メソッドの最後で常ににを設定する必要がありますcurrentElementContent。この例を以下に示します。nildidEndElement

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    // Do what you want with the parser here

    // Set element content variable to nil
    currentElementContent = nil;
}

変数を置き換える必要がある場合がありcurrentElementContentます。開始タグと終了タグの間にあるコンテンツを格納するためにパーサーで使用した変数に置き換えます。

于 2013-12-02T16:11:59.150 に答える