2017-01-02 56 views
0

我想如下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)) 
} 
+0

我不知道我们有足够的诊断,因为你引用了一些非标准和未定义的类型。它看起来像某种形式的UTF8到/从C字符串问题,或类似的东西,但没有足够的在这里诊断。 – Rob

+0

可能不相关,您的'foundCharacters'看起来不太正确,因为它有时可能需要多次调用'foundCharacters'来返回整个字符串。我认为这不是问题,但在这段代码中看起来像是一个更微妙的问题... – Rob

+0

感谢您评论@Rob。其余代码更多地将数据保存到CoreData并将其恢复。这是否必须对这个问题做任何事情? –

回答

0

我已经通过如下改变我的代码解决了这个问题。 似乎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 
     } 
    } 
} 
1

,可以储存任何特殊或外语字符在他们的HTML编码格式的XML。举个例子,当我需要编写XML的一个&符号我做了以下:

<name>Jones &amp; Jones</name> 

在你的情况下,它应该是:

<FrNm>Vierges britanniques (les &Icirc;les)</FrNm> 

this HTML encoding table.

+0

谢谢你的想法。它有帮助。但是,如果有特殊字符,似乎func解析器(_ parser:XMLParser,foundCharacters string:String)在标签内多次读取。 (@Rob提出的想法) –