我正在尝试通过REST Web服务下载XML格式的数据。我已经使用NSXMLParser创建了解析器,并在TableView中可视化了数据。
当我遇到带有重音符号的XML文档句子时遇到问题。
在一些研究中,我发现这stackoverflow.com/questions/10215221/nsxmlparser-cant- parse-special-characters-accents)与我的问题非常相似,并试图实现它:
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文件。
println (resulset)
问题是当我运行解析器时,重读的字符无法读取
当我在解析器中找到字符时,这是代码:
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()中正确打印文档。
相反,当我去保存找到的数据时,如果“它”为我节省了这个时间:
“稳定”
该parser:foundCharacters:委托方法可以被调用一次以上对于单个XML元素。在您的示例中,它将用“ Contabilit”调用一次,并用“ànazionale”调用一次。
parser:foundCharacters:
因此,您必须 将找到的字符串从 串联didStartElement到didEndElement。
didStartElement
didEndElement
这是一个非常简单的示例,说明如何完成此操作。当然,如果嵌套了XML元素,它将变得更加复杂。
将当前元素字符串的属性添加到您的类中:
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 ?? "" }