ios - NSXMLParser: resultado inesperado con caracteres no ASCII
swift (1)
Estoy tratando de descargar datos en formato XML a través de los servicios web REST. Ya he creado el analizador con NSXMLParser y visualizo los datos en un TableView.
Tengo problemas cuando me encuentro en el documento XML con oraciones con acento.
Entre algunas investigaciones encontré this 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)
todo el archivo XML correctamente decodificado.
El problema es que cuando ejecuto el analizador, los caracteres acentuados no se leen
Este es el código cuando encontré caracteres en el analizador:
func parser(parser: NSXMLParser!, foundCharacters string: String!) {
myList[position] = string
}
EDITAR:
Este es un ejemplo de mi documento:
<Name xml:lang="en" xmlns="">National Accounts</Name>
<Name xml:lang="it" xmlns="">Contabilità nazionale</Name>
En println () imprima el documento correctamente como se describe arriba.
En cambio, cuando voy a guardar los datos encontrados carachter si "eso" me salva esto:
"Contabilit"
El
parser:foundCharacters:
se puede llamar al método delegado 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 anidados.
Agregue una propiedad para la cadena de elementos actual a su clase:
var currentElement : String?
Y luego implemente los métodos delegados 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 ?? ""
}