2010-06-30 57 views
2

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

某些XML日期已嵌套元素与文本,我有点难以获得核心数据在NSXML的回调中心世界中很好地播放。

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

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

我想我可能会建立一个物体叠堆出来的NSMutableArray'saddObject:removeLastObject:方法,但我不知道是否有更简单的东西,或者我在这里错过了一些大局。

回答

0

我跑到类似的问题,正如你所提到的,结束了与addObject:,lastObjectremoveLastObject:堆栈。它可以快速合理地解析。

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

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

所以我有这样的(在我的例子ParentChild)包含在其他实体的实体之一栈,另一个包含对应的keypaths到数据(Parent_Data1,Parent_Data2Child_Data1)。当我在parser:foundCharacters中找到数据时,我会使用setValue:forKeyPath:将其设置在最顶端的实体上,并在我到达parser:didEndElement:时弹出。

希望有所帮助。

+0

谢谢,paxswill-很高兴知道我并不孤单。你关于封闭实体的观点也很好。祝好,查尔斯 – cturner 2010-06-30 09:58:28