2012-04-18 9 views
9

ich NSXMLParser bin mit einem xml von einer URL zu analysieren (mein Code ist fast genau die gleiche wie here)NSXMLParser keine Sonderzeichen analysieren kann (Akzent)

Einige der Elemente enthalten Sonderzeichen wie „á "was bewirkt, dass sich ein Wort wie zwei teilt (á und ndre).

Hier ist meine 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;} 

Ich bin ziemlich sicher, es ist, weil die Codierung nicht gesetzt ist (ich glaube, es NSUTF8StringEncoding sein muss), aber ich bin nicht sicher, wo/wie sie anzuwenden.

[UPDATE] Rest meines Code ...

- (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] Probe xml ...

<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

Ich bin neu zu Obj-C, aber es würde mir scheinen, dass Sie Daten in einen NSString konvertieren könnten, kodieren Sie das als UTF8 [wie hier] (http://stackoverflow.com/questions/2467844/ convert-utf-8-encoded-nsdata-to-nsstring) und diese an NSXMLParser übergeben? – inkedmn

+0

Ich benutze NSXMLParser viel und habe dieses Problem nicht gehabt. Können Sie den Teil des Codes posten, der den XML-Text verarbeitet? –

+0

Den Rest meines Codes veröffentlicht. Ich frage mich, ob das Problem jetzt in foundCharacters liegt? –

Antwort

5

ich die URL zu einer NSString laden würde und dann konvertieren so was.

-(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: Ein Teil des Problems sein kann, dass Ihre parser:foundCharacters: Verfahren zu Ihrem currentNodeContent Zuweisung statt anfügen. Sehen Sie sich den Apple Doc unter folgendem Link an.

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

Vom doc:

Da Zeichenfolge nur ein Teil des Gesamtzeichen Inhalt für das aktuelle Element sein kann, sollten Sie es auf die aktuelle Anhäufung von Zeichen, bis das Element Änderungen anhängen.

+1

Danke. Das hat mein Problem nicht ganz gelöst (obwohl ich dachte, dass es so wäre)! Einen NSLog machen (@ "% @", dataString); zeigt, dass die Zeichenfolge tatsächlich Zeichen mit Akzenten usw. enthält, was großartig ist.Aber ein Wort wie Ándre bricht immer noch. Das lässt mich glauben, dass das Problem in foundcharacters() liegt. Siehe meine aktualisierte Frage. –

+0

Ist die Arbeit in dem Protokoll, das Sie erwähnt haben, oder erst nach dem Überdenken des Parsers gebrochen? –

+0

Im Protokoll werden die Strings korrekt angezeigt. Beim Hinzufügen des Objekts zum Ticket-Array wird ein Name mit einem Sonderzeichen als zwei separate Objekte registriert. –

1

Verwenden

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; 

und die Zeichenfolge von ihm zu bekommen, dies zu tun:

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

Dann können Sie die XML in Ihre NSXMLParserDelegate Methoden analysieren.

Hoffe, das hilft.

4

Das Problem gefunden! Es ist tatsächlich in gefundenen Zeichen. Sie sollten Ihren Code zu diesem ändern:

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

Ich hatte das gleiche Problem vor, und der obige Code hat es behoben.