NSXMLParser: risultato imprevisto con caratteri non ASCII

Sto cercando di scaricare i dati in formato XML tramite i servizi web REST. Ho già creato il parser con NSXMLParser e visualizzo i dati in un TableView.

Ho problemi quando incontro le frasi del documento XML con l’accento.

Tra alcune ricerche ho trovato questo molto simile al mio problema e ho cercato di implementarlo:

func parse(handler: () -> Void) { self.handler = handler dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { self.countCategoryScheme = 0 var url = NSURL(string: SomeStructure.firstLink); var err:NSError = NSError() var dataString: String = String(contentsOfURL: url!, encoding: NSUTF8StringEncoding, error: nil)! var data: NSData = dataString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! let parser = NSXMLParser(data: data) let resulset = NSString(data: data, encoding: NSUTF8StringEncoding) println(resulset) parser.delegate = self; parser.parse(); if !parser.parse() { self.delegate?.XMLParserError(self, error: "I Parse Error") println("I Parser error") } } } 

in println (resulset) correttamente l’intero file XML decodificato.

Il problema è quando eseguo il parser, i caratteri accentati non vengono letti

Questo è il codice quando ho trovato i caratteri nel parser:

  func parser(parser: NSXMLParser!, foundCharacters string: String!) { myList[position] = string } 

MODIFICARE:

Questo è un esempio del mio documento:

 National Accounts Contabilità nazionale 

In println () stampa il documento correttamente come descritto sopra.

Invece, quando vado a salvare i dati trovati carachter se “it” mi salva questo:

“Contabilit”

Il parser:foundCharacters: metodo delegate può essere chiamato più volte per un singolo elemento XML. Nel tuo esempio, verrebbe chiamato una volta con “Contabilit” e una volta con “à nazionale”.

Pertanto è necessario concatenare le stringhe trovate da didStartElement fino a didEndElement .

Ecco un esempio molto semplice di come questo può essere fatto. Naturalmente diventa più complicato se si hanno elementi XML annidati.

Aggiungi una proprietà per la stringa di elemento corrente alla tua class:

 var currentElement : String? 

E quindi implementare i metodi delegati come questo:

 func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) { // If a "Name" element started (which you are interested in), set // currentElement to an empty string, so that the found characters // can be collected. Otherwise set it to nil. if elementName == "Name" { currentElement = "" } else { currentElement = nil } } func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { // If the "Name" element ended, get the collected string and // append it to your list. if elementName == "Name" { if let name = currentElement { println(name) myList.append(name) } } currentElement = nil } func parser(parser: NSXMLParser, foundCharacters string: String?) { // If currentElement is not nil, append the found characters to it: currentElement? += string ?? "" }