NSXMLParser:非 ASCII 字符的意外结果
NSXMLParser: Unexpected result with non-ASCII characters
我正在尝试通过 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 正确解码的文件。
问题是当我 运行 解析器时,无法读取重音字符
这是我在解析器中找到字符时的代码:
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 if "it" 给我保存了这个:
"Contabilit"
parser:foundCharacters:
委托方法可调用次数超过
一次用于单个 XML 元素。在您的示例中,它将被称为
一次是 "Contabilit",一次是 "à nazionale"。
因此你必须连接
从 didStartElement
到 didEndElement
.
找到的字符串
这是一个非常简单的示例,说明如何完成此操作。当然得到
如果嵌套了 XML 个元素,会更复杂。
为当前元素字符串添加一个 属性 到您的 class:
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 ?? ""
}
我正在尝试通过 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 正确解码的文件。
问题是当我 运行 解析器时,无法读取重音字符
这是我在解析器中找到字符时的代码:
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 if "it" 给我保存了这个:
"Contabilit"
parser:foundCharacters:
委托方法可调用次数超过
一次用于单个 XML 元素。在您的示例中,它将被称为
一次是 "Contabilit",一次是 "à nazionale"。
因此你必须连接
从 didStartElement
到 didEndElement
.
这是一个非常简单的示例,说明如何完成此操作。当然得到 如果嵌套了 XML 个元素,会更复杂。
为当前元素字符串添加一个 属性 到您的 class:
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 ?? ""
}