【问题标题】:NSXMLParser: Unexpected result with non-ASCII charactersNSXMLParser:非 ASCII 字符的意外结果
【发布时间】:2015-03-28 14:25:43
【问题描述】:

我正在尝试通过 REST Web 服务下载 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 文件。

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

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

   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()中按上述正确打印文档。

相反,当我去保存找到的数据时,如果“它”为我保存了这个:

“兼容性”

【问题讨论】:

  • 好的,我已经编辑了希望我更清楚:)
  • 你能举一个例子来说明你在 String 中得到了什么(参考来源和你的期望)吗?
  • 好的,我用一个例子编辑了

标签: ios swift nsxmlparser


【解决方案1】:

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

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

这是一个非常简单的示例,如何做到这一点。当然会得到 如果您有嵌套的 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 ?? ""
}

【讨论】:

  • 哇,谢谢!但我不明白为什么它会起作用。我不明白,因为它将短语分成两部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多