NSXMLParser:使用非ASCII字符的意外结果

我试图通过REST Web服务以XML格式下载数据。 我已经使用NSXMLParser创build了parsing器,并在TableView中可视化数据。

当我在带有口音的XML文档中遇到问题时遇到问题。

在一些研究中,我发现这与我的问题非常相似,并试图实现它:

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

println (resulset)我打印正确解码的整个XML文件。

问题是当我运行parsing器,重音字符不会被读取

这是在parsing器中find字符时的代码:

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

编辑:

这是我的文档的一个例子:

 <Name xml:lang="en" xmlns="">National Accounts</Name> <Name xml:lang="it" xmlns="">Contabilità nazionale</Name> 

在println()中正确地打印文档,如上所述。

相反,当我去保存数据发现carachter如果“它”救了我这个:

“Contabilit”

parser:foundCharacters:可以为单个XML元素多次调用delegate方法。 在你的例子中,它将被称为一次与“Contabilit”,一次与“ànazionale”。

因此,您必须连接didStartElementfind的string,直到didEndElement

这是一个非常简单的例子,可以做到这一点。 当然,如果你有嵌套的XML元素,它会变得更加复杂。

将当前元素string的属性添加到您的类中:

 var currentElement : String? 

然后像这样实现委托方法:

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