将XML数据解析到Core Data中

3
我正在尝试从在线xml文件中获取数据并将其放入我的核心数据中。
我可以成功地检索数据,甚至可以将其放入核心数据中,但似乎只有最后检索到的源被存储。 这里是我正在尝试检索的xml文件的示例。
解析器代码示例:
    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        if (elementName as NSString).isEqualToString("question") {
            if !xml_tmp1.isEqual(nil) {
                elements.setObject(xml_tmp1, forKey: "text")
            }
            if !xml_tmp2.isEqual(nil) {
                elements.setObject(xml_tmp2, forKey: "answer0")
            }

            if !xml_tmp3.isEqual(nil) {
                elements.setObject(xml_tmp3, forKey: "answer1")
            }

            if !xml_tmp4.isEqual(nil) {
                elements.setObject(xml_tmp4, forKey: "answer2")
            }

            if !xml_tmp5.isEqual(nil) {
                elements.setObject(xml_tmp5, forKey: "answer3")
            }
            tmp_xml.addObject(elements)
        }
    }

Core Data代码示例:

    func temp_func() {
        var n: Int = tmp_xml.count
        var i: Int = 0

        var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)
        var context: NSManagedObjectContext = appDel.managedObjectContext!

        var tmp = NSEntityDescription.insertNewObjectForEntityForName("Questions", inManagedObjectContext: context) as! NSManagedObject

        while (i != br) {
            tmp.setValue(tmp_xml.objectAtIndex(i).valueForKey("text"), forKey: "question")
            tmp.setValue(tmp_xml.objectAtIndex(i).valueForKey("answer0"), forKey: "answer_1")
            tmp.setValue(tmp_xml.objectAtIndex(i).valueForKey("answer1"), forKey: "answer_2")
            tmp.setValue(tmp_xml.objectAtIndex(i).valueForKey("answer2"), forKey: "answer_3")
            tmp.setValue(tmp_xml.objectAtIndex(i).valueForKey("answer3"), forKey: "answer_4")

            i++
        }

        context.save(nil)
    }

基本上,我应该在我的核心数据中获得三个新条目,但只有最后一个(15 * 7问题)被存储。

只是猜测:如果我没弄错,在你的 while 循环中,你一遍又一遍地为同一个对象上的相同键设置值。tmp.setValue(tmp_xml.objectAtIndex(0).valueForKey("text"), forKey: "question") 然后 tmp.setValue(tmp_xml.objectAtIndex(1).valueForKey("text"), forKey: "question")tmp 只会有最后一次迭代(1)的 "question" 键。 - Eric Aya
是的,你说得对,谢谢你的帮助 :D - user4916078
1个回答

2
我认为您只需在核心数据中创建一个条目,并设置值,然后保存即可。因此,只有最后一个条目会保存在核心数据中。您可以在while循环中创建条目,像这样看看它是否能工作?
func temp_func() {
    var n: Int = tmp_xml.count
    var i: Int = 0

    var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)
    var context: NSManagedObjectContext = appDel.managedObjectContext!


    while (i != br) {
        var tmp = NSEntityDescription.insertNewObjectForEntityForName("Questions", inManagedObjectContext: context) as! NSManagedObject
        tmp.setValue(tmp_xml.objectAtIndex(i).valueForKey("text"), forKey: "question")
        tmp.setValue(tmp_xml.objectAtIndex(i).valueForKey("answer0"), forKey: "answer_1")
        tmp.setValue(tmp_xml.objectAtIndex(i).valueForKey("answer1"), forKey: "answer_2")
        tmp.setValue(tmp_xml.objectAtIndex(i).valueForKey("answer2"), forKey: "answer_3")
        tmp.setValue(tmp_xml.objectAtIndex(i).valueForKey("answer3"), forKey: "answer_4")

        i++
    }

    context.save(nil)
}

XML文件返回的值包含制表符和换行符,那么我该如何去除它们以获取纯字符串值。我已经尝试了以下方法,但它并不起作用,谢谢。tmp.setValue(tmp_xml.objectAtIndex(i).valueForKey("answer0".stringByReplac‌​ingOccurrencesOfString("\n\t", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil), forKey: "answer_1") - user4916078
好的,我已经解决了。我没有意识到函数 stringByReplacingOccurrencesOfString() 返回一个新字符串而不是修改现有的字符串。感谢大家的帮助。 - user4916078

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接