NSXMLParser: resultado inesperado con caracteres que no son ASCII

Estoy tratando de descargar datos en formato XML a través de un servicio web REST. Ya he creado el analizador con NSXMLParser y visualizo los datos en un TableView.

Tengo problemas cuando me encuentro en las oraciones del documento XML con el acento.

Entre algunas investigaciones encontré esto muy similar a mi problema e intenté 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") } } } 

en println (resulset) el archivo XML completo decodificado correctamente.

El problema es cuando ejecuto el analizador, los caracteres acentuados no se leen

Este es el código cuando encuentro Caracteres en el analizador:

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

EDITAR:

Este es un ejemplo de mi documento:

 National Accounts Contabilità nazionale 

En println () imprima el documento correctamente como se describe arriba.

En cambio, cuando voy a guardar los datos encontrados, carachter si “esto” me salva esto:

“Contabilit”

El parser:foundCharacters: método de delegado se puede parser:foundCharacters: más de una vez para un solo elemento XML. En su ejemplo, se llamaría una vez con “Contabilit” y una vez con “à nazionale”.

Por lo tanto, debe concatenar las cadenas encontradas desde didStartElement hasta didEndElement .

Aquí hay un ejemplo muy simple de cómo se puede hacer esto. Por supuesto, se vuelve más complicado si tiene elementos XML nesteds.

Agregue una propiedad para la cadena del elemento actual a su clase:

 var currentElement : String? 

Y luego implementa los métodos de delegado como este:

 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 ?? "" }