ios - NSXMLParser:非 ASCII 字符的意外结果

标签 ios swift nsxmlparser

我正在尝试通过 REST 网络服务下载 XML 格式的数据。 我已经使用 NSXMLParser 创建了解析器,并在 TableView 中可视化了数据。

当我在 XML 文档中遇到带重音的句子时遇到问题。

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

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 文件。

问题是当我运行解析器时,重音字符没有被读取

这是我在解析器中找到字符时的代码:

   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 如果“它”给我保存了这个:

“接触”

最佳答案

parser:foundCharacters:委托(delegate)方法可以被多次调用 一次用于单个 XML 元素。在您的示例中,它将被称为 一次是“Contabilit”,一次是“à nazionale”。

因此你必须连接didStartElementdidEndElement 找到的字符串。

这是一个非常简单的例子,说明如何做到这一点。当然得到 如果您有嵌套的 XML 元素,会更复杂。

将当前元素字符串的属性添加到您的类中:

var currentElement : String?

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

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

关于ios - NSXMLParser:非 ASCII 字符的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38658483/

相关文章:

ios - 如何正确使用模态视图 Controller ?

ios - trackWithMediaType 有时返回 0 首轨道

ios - 插页式广告立即隐藏并展开转场

objective-c - NSXMLParser 创建节点和 NSMutableArray

ios - 尝试使用 NSXMLParser 委托(delegate)解析 NSData 时出错

ios - 将文件保存到 icloud 驱动器

Swift - Required Initializer 与 Delegating initializer 之间的一点混淆

swift - 类属性 'current' 在异步上下文中不可用; Thread.current 不能在异步上下文中使用。这是 Swift 6 中的一个错误

ios - 如何在 Xcode 中解析 XML 页面中的图像?

ios - 如何在 iOS 上删除相册?