XMLParser中有问题阅读UTF8字符
问题描述:
<CntyNtry>
<EngNm>Virgin Islands (British)</EngNm>
<FrNm>Vierges britanniques (les Îles)</FrNm>
<A2Cd>VG</A2Cd>
<A3Cd>VGB</A3Cd>
<CtryNbr>92</CtryNbr>
</CntyNtry>
正如你可以看到,有一些字母的一些口音解析XML。
我试图如果有人需要代码的其余部分的细节如下代码
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
if elementName == Element.getXMLRecordElementTagName() {
stack.push(Element.newObject())
record.removeAll(keepingCapacity: false)
} else if Element.getXMLRecordAttributeElementTagName().contains(elementName) {
stackKey.push(Element.getNSManagedObjectAttributeName(fromXMLRecordElementTagName: elementName))
}
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
let key = stackKey.pop()
if key != nil {
record[key!] = string
}
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if elementName == Element.getXMLRecordElementTagName() {
Element.add(object: record)
record.removeAll(keepingCapacity: false)
}
}
解析XML,请让我知道,但基本上记录[关键!=字符串应该是能读UTF8字符。
当我测试单元代码上的数据时,出现以下错误,其中字符串在重音字符串之后未被读取。我尝试了所有其他重音的数据,这是相同的错误。
XCTAssertEqual失败:( “可选(” Vierges britanniques(LES “)”)不等于( “可选(” Vierges britanniques(LES尔斯) “)”) -
是我的单元测试代码错了吗?或者是有问题的解析器?
func testImportDataCnty() {
Country.delete()
XCTAssertTrue(Country.count() == 0)
XCTAssertTrue(importerCnty.importData())
XCTAssertTrue(Country.count() > 0)
let kor = Country.get(id: ["VGB"])?[0] as! Country
XCTAssertEqual(kor.englishName, country2["englishName"] as? String)
XCTAssertEqual(kor.frenchName, country2["frenchName"] as? String)
//Test failed on the above row.
XCTAssertEqual(kor.alpha2Code, country2["alpha2Code"] as? String)
XCTAssertEqual(kor.alpha3Code, country2["alpha3Code"] as? String)
XCTAssertEqual(kor.countryNumber, Int16(country2["countryNumber"] as! Int))
}
答
我已经通过如下改变我的代码解决了这个问题。 似乎found字符分析器多次读取字符串,如果字符串中有特殊字符,所以我需要将它们全部追加。
func parser(_ parser: XMLParser, foundCharacters string: String) {
let key = stackKey.peek()
if key != nil {
if record[key!] != nil {
record[key!] = record[key!]! + string
} else {
record[key!] = string
}
}
}
答
,可以储存任何特殊或外语字符在他们的HTML编码格式的XML。举个例子,当我需要编写XML的一个&符号我做了以下:
<name>Jones & Jones</name>
在你的情况下,它应该是:
<FrNm>Vierges britanniques (les Îles)</FrNm>
+0
谢谢你的想法。它有帮助。但是,如果有特殊字符,似乎func解析器(_ parser:XMLParser,foundCharacters string:String)在标签内多次读取。 (@Rob提出的想法) –
我不知道我们有足够的诊断,因为你引用了一些非标准和未定义的类型。它看起来像某种形式的UTF8到/从C字符串问题,或类似的东西,但没有足够的在这里诊断。 – Rob
可能不相关,您的'foundCharacters'看起来不太正确,因为它有时可能需要多次调用'foundCharacters'来返回整个字符串。我认为这不是问题,但在这段代码中看起来像是一个更微妙的问题... – Rob
感谢您评论@Rob。其余代码更多地将数据保存到CoreData并将其恢复。这是否必须对这个问题做任何事情? –