I've been working on importing XML into an iPad Core Data application. I have a working NSXMLParser implementation for my files, and have been able to import the simpler (ie attribute-only) elements into Core Data.
Some of the XML dated has nested elements with text, and I'm a bit stumped on how to get Core Data to play nicely in the callback-centric world of NSXML.
If I see a new XML element, I need to insert a new managed object into my context. If I do this in NSXML's didStartElement:, I need to preserve a reference to it so that I can store my XML text element when didEndElement: is called.
Given that my XML elements are nested, I may have encountered several didStartElements: before I encounter a didEndElement:, so I need something more than a single object instance to preserve the managed object across callbacks. (Also, I think that insertNewO开发者_Go百科bjectForEntityForName: is autoreleased, so I need to retain a copy of the managed object.)
I thought I might build an object stack out of NSMutableArray's addObject: and removeLastObject: methods, but I wonder if there's something simpler, or I've missed some piece of the big picture here.
I've run unto a similar problem, and as you mentioned, ended up using stacks with addObject:, lastObject and removeLastObject:. It parses reasonably quickly.
In my specific case, I had a number of Core Data entities, both with instance variables and to-many relationships to their child elements. I used two stacks, one for the objects, and one for the elements. In my case the parent elements did not have data of their own, ex:
<Parent>
<Parent_Data1>Foo</ParentData1>
<Parent_Data2>Bar</ParentData2>
<Child>
<Child_Data1>Baz</Child_Data1>
</Child>
</Parent>
So I had one stack of the entities that contained other entities (Parent and Child in my example), with another containing the keypaths corresponding to the data (Parent_Data1, Parent_Data2 and Child_Data1). When I found the data in parser:foundCharacters I would set it on the topmost entity using setValue:forKeyPath: and pop that when I got to parser:didEndElement:.
Hope that helps.
加载中,请稍侯......
精彩评论