我一直致力于将XML导入iPad Core Data应用程序。我的文件有NSXMLParser
实现,并且能够将更简单(即仅属性)的元素导入到核心数据中。
某些XML日期中嵌套了带文本的元素,我对如何让Core Data在以NSXML以回调为中心的世界中发挥出色而感到有点难过。
如果我看到一个新的XML元素,我需要在我的上下文中插入一个新的托管对象。如果我在NSXML的didStartElement:
中执行此操作,我需要保留对它的引用,以便在调用didEndElement:
时可以存储我的XML文本元素。
鉴于我的XML元素是嵌套的,在遇到didStartElements:
之前我可能遇到过几个didEndElement:
,因此我需要的不仅仅是单个对象实例来保留跨回调的托管对象。 (另外,我认为insertNewObjectForEntityForName:
是自动释放的,所以我需要保留托管对象的副本。)
我以为我可以使用NSMutableArray's
addObject:
和removeLastObject:
方法构建一个对象堆栈,但我想知道是否有更简单的东西,或者我错过了一些大图片这里。
答案 0 :(得分:0)
我遇到了类似的问题,正如您所提到的,最终使用了addObject:
,lastObject
和removeLastObject:
的堆栈。它合理地快速解析。
在我的具体情况中,我有许多核心数据实体,它们都有实例变量和与子元素的多对多关系。我使用了两个堆栈,一个用于对象,一个用于元素。在我的例子中,父元素没有自己的数据,例如:
<Parent>
<Parent_Data1>Foo</ParentData1>
<Parent_Data2>Bar</ParentData2>
<Child>
<Child_Data1>Baz</Child_Data1>
</Child>
</Parent>
所以我有一堆包含其他实体的实体(在我的示例中为Parent
和Child
),另一个包含与数据对应的keypath(Parent_Data1
,{{ 1}}和Parent_Data2
)。当我在Child_Data1
中找到数据时,我会使用parser:foundCharacters
将其设置在最顶层的实体上,并在我到达setValue:forKeyPath:
时弹出。
希望有所帮助。