2012-04-18 7 views
9

特殊文字(アクセント)を解析することができない要素の一部が「áなどの特殊文字が含まれているNSXMLParser私はURLからXMLを解析するためにNSXMLParserを使用してい

(私のコードは、ほぼ正確にhereと同じです)これは、単語lik anndreを2つに分割する(áとndre)。

は、ここで私はエンコーディングが設定されていないからだとかなり確信している私のloadXMLByURL

-(id) loadXMLByURL:(NSString *)urlString{ 
tickets  = [[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;} 

ですが、ここで、/それを適用する方法を、私はわからないんだけど(私はそれがNSUTF8StringEncodingにする必要があると思います)。

私はNSStringにURLをロードし、変換します

<RB> 
    <list> 
     <ticket> 
      <name>Andrew Ford</name> 
      <title>3rd release</title> 
      <status>1</status> 
     </ticket> 

     <ticket> 
      <name>David Jenkins</name> 
      <title>3rd release</title> 
      <status>0</status> 
     </ticket> 

     <ticket> 
      <name>Luis gomez ándre</name> 
      <title>3rd release</title> 
      <status>1</status> 
     </ticket> 
    </list> 
</RB> 
+0

Obj-Cの新機能ですが、データをNSStringに変換し、UTF8としてエンコードすることができます。[ここに示す](http://stackoverflow.com/questions/2467844/) convert-utf-8-encoded-nsdata-to-nsstring)をNSXMLParserに渡しますか? – inkedmn

+0

私はNSXMLParserをたくさん使いますが、その問題はありませんでした。 XMLテキストを処理するコードの部分を投稿できますか? –

+0

残りのコードを投稿してください。私は今問題がfoundCharactersにあるのだろうか? –

答えて

5

[UPDATE]私のコードの 残り...

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{  
    if ([elementname isEqualToString:@"ticket"]) 
    { 
     currentTicket = [Ticket alloc]; 
    } 

} 

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if ([elementname isEqualToString:@"name"]) 
    { 
     currentTicket.name = currentNodeContent; 
    } 
    else if ([elementname isEqualToString:@"title"]) 
    { 
     currentTicket.title = currentNodeContent; 
    } 
    else if ([elementname isEqualToString:@"status"]) 
    { 
     currentTicket.status = currentNodeContent; 
    } 
    else if ([elementname isEqualToString:@"ticket"]) 
    { 
     [tickets addObject:currentTicket]; 
     [currentTicket release]; 
     currentTicket = nil; 
     [currentNodeContent release]; 
     currentNodeContent = nil; 
    } 

} 

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

[UPDATE 2] サンプルXML ...このような。

-(id) loadXMLByURL:(NSString *)urlString{ 

    tickets  = [[NSMutableArray alloc] init]; 
    NSURL *url  = [NSURL URLWithString:urlString]; 
    NSError *error; 
    NSString * dataString = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; 
    NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; 
    parser   = [[NSXMLParser alloc] initWithData:data]; 
    parser.delegate = self; 
    [parser parse]; 
    return self; 

} 

EDIT:問題の 一部はあなたのparser:foundCharacters:方法は、あなたのcurrentNodeContentに割り当てる代わりに追加されている可能性があります。次のリンクのApple Docを参照してください。

http://developer.apple.com/library/ios/#documentation/cocoa/reference/NSXMLParserDelegate_Protocol/Reference/Reference.html

ドキュメントから:

文字列が現在の要素の合計文字内容の一部のみである可能性があるので、あなたは、要素が変化するまで、文字の現在の蓄積に追加しなければなりません。

+1

ありがとうございます。それは私の問題を解決しませんでした。 NSLogを実行する(@ "%@"、dataString);文字列にアクセントなどの文字が含まれていることがわかります。しかし、ándreのような言葉はまだ壊れています。それは問題がfoundcharacters()にあると思います。更新された質問を参照してください。 –

+0

あなたが言及したログの中で作業が壊れているのですか? –

+0

ログに文字列が正しく表示されます。チケット配列にオブジェクトを追加すると、特殊文字の名前が2つの別々のオブジェクトとして登録されます。 –

1

使用

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; 

とそれから文字列を取得するには、次の操作を行います。

NSString *theXML = [[NSString alloc] initWithBytes:[data mutableBytes] 
                length:[data length] 
               encoding:NSUTF8StringEncoding]; 

は、その後、あなたのNSXMLParserDelegate方法でXMLを解析することができます。

これが役に立ちます。

4

問題が見つかりました。確かに発見された文字です。コードを次のように変更する必要があります。

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    NSLog(@"found characters: %@", string); 
    if (!currentNodeContent) { 
     currentNodeContent = [[NSMutableString alloc] init]; 
    } 
    [currentNodeContent appendString:string]; 
} 

私は前に同じ問題を抱えていましたが、上記のコードで修正されています。

関連する問題