XMLParser 在读取 UTF8 字符时出现问题 [英] XMLParser has problems reading UTF8 characters
问题描述
我正在尝试按如下方式解析 XML
I am trying to parse an XML as follows
<CntyNtry>
<EngNm>Virgin Islands (British)</EngNm>
<FrNm>Vierges britanniques (les Îles)</FrNm>
<A2Cd>VG</A2Cd>
<A3Cd>VGB</A3Cd>
<CtryNbr>92</CtryNbr>
</CntyNtry>
如您所见,某些字母上有一些重音.
As you can see, there are some accents on some of the letters.
我尝试使用以下代码解析 XML
I tried to parse the XML with following code
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)
}
}
如果有人需要其余代码的详细信息,请告诉我,但基本上 record[key!] = string 应该能够读取 UTF8 字符.
If anybody needs the detail of the rest of the code, please let me know but basically record[key!] = string should be able to read the UTF8 characters.
当我在我的单元代码上测试数据时,出现以下错误,在重音字符串之后没有读取字符串.我已经尝试了所有其他带口音的数据,但还是一样的错误.
When I test the data on my unit code, I get following error, where the string is not read after the accent string. I have tried all other data with accents and it is same error.
XCTAssertEqual 失败:("Optional("Vierges britanniques (les")") 不等于 ("Optional("Vierges britanniques (les Îles)")") -
XCTAssertEqual failed: ("Optional("Vierges britanniques (les")") is not equal to ("Optional("Vierges britanniques (les Îles)")") -
我的单元测试代码错了吗?还是解析器有问题?
Is my unit test code wrong? or is there a problem in the parser?
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))
}
推荐答案
我已经通过如下更改代码解决了这个问题.如果字符串中有特殊字符,foundCharacter 解析器似乎会多次读取该字符串,因此我需要将它们全部追加.
I have solved the issue by changing my code as below. It seems that foundCharacter parser reads the string multiple times if there is a special character in the string, so I needed to append them all.
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
}
}
}
这篇关于XMLParser 在读取 UTF8 字符时出现问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!