通过NSXMLParser将复杂的XML导入核心数据?

时间:2010-06-30 03:06:51

标签: objective-c xml core-data

我一直致力于将XML导入iPad Core Data应用程序。我的文件有NSXMLParser实现,并且能够将更简单(即仅属性)的元素导入到核心数据中。

某些XML日期中嵌套了带文本的元素,我对如何让Core Data在以NSXML以回调为中心的世界中发挥出色而感到有点难过。

如果我看到一个新的XML元素,我需要在我的上下文中插入一个新的托管对象。如果我在NSXML的didStartElement:中执行此操作,我需要保留对它的引用,以便在调用didEndElement:时可以存储我的XML文本元素。

鉴于我的XML元素是嵌套的,在遇到didStartElements:之前我可能遇到过几个didEndElement:,因此我需要的不仅仅是单个对象实例来保留跨回调的托管对象。 (另外,我认为insertNewObjectForEntityForName:是自动释放的,所以我需要保留托管对象的副本。)

我以为我可以使用NSMutableArray's addObject:removeLastObject:方法构建一个对象堆栈,但我想知道是否有更简单的东西,或者我错过了一些大图片这里。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,正如您所提到的,最终使用了addObject:lastObjectremoveLastObject:的堆栈。它合理地快速解析。

在我的具体情况中,我有许多核心数据实体,它们都有实例变量和与子元素的多对多关系。我使用了两个堆栈,一个用于对象,一个用于元素。在我的例子中,父元素没有自己的数据,例如:

<Parent>
    <Parent_Data1>Foo</ParentData1>
    <Parent_Data2>Bar</ParentData2>
    <Child>
        <Child_Data1>Baz</Child_Data1>
    </Child>
</Parent>

所以我有一堆包含其他实体的实体(在我的示例中为ParentChild),另一个包含与数据对应的keypath(Parent_Data1,{{ 1}}和Parent_Data2)。当我在Child_Data1中找到数据时,我会使用parser:foundCharacters将其设置在最顶层的实体上,并在我到达setValue:forKeyPath:时弹出。

希望有所帮助。