2010-06-30 59 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