应该采取哪些步骤将我的XML转换为Core Data对象?

时间:2010-02-19 00:54:15

标签: xml cocoa cocoa-touch core-data key-value-coding

我有一个XML文件,其中包含商店列表,简化版本如下。我想要帮助的是关于将这些数据移动到Core Data中的存储对象的最简单方法的一些高级想法。我看到关于键值对的建议,但正如您在下面的示例中所看到的,我有子元素具有相同的名称/键,并且每个商店元素可以有任意数量的这些元素。

我打算在应用程序中存储这些对象以供将来使用(它们将在地图上注释)。因此,需要存储每个重复的字段,其中一个是不够的。我知道如何在Core Data中对其进行建模我相信,我将拥有一个电话号码实体和一个商店实体,并将基于<store-id>将两者联系起来。我只是尝试使用一种简单的方法通过其他一些数据结构将它们从XML移动到Core Data。

XML示例:

<stores>
  <store>
   <store-id>1</store-id>
   <city>Dublin</city>
   <phone>011234567</phone>
   <phone>011234566</phone>
   <owner>Joe Bloggs</owner>
  </store>
  <store>
   <store-id>2</store-id>
   <city>Cork</city>
   <phone>019876543</phone>
   <phone>019876542</phone>
   <owner>Joe Bloggs</owner>
  </store>
<stores>

如果要使用键值对,请指出我可以考虑重复元素的方法。如果还有另一种方式,我会全力以赴。

由于

3 个答案:

答案 0 :(得分:5)

更难的部分是设计一个有意义的数据模型。您可能需要一个实体用于商店,一个用于电话,可能还需要一个用于所有者。商店应该是一对多的电话号码,与所有者一对一(只看你的数据)。

一旦您布置了数据模型,您就可以使用NSXMLParser或TouchXML等第三方库来解析XML。从您的元素开始。对于其中的每个项目,基于商店实体创建对象。对于元素中的每部手机,请创建手机实体,依此类推。

答案 1 :(得分:0)

我敢说,一种即时解析方法可能不仅是最简单的方法,而且也是资源密集程度最低的方法。如果您可以使用面向流的解析器来处理XML,并在解析它们时保存存储,那么您在内存中一次保存的内容要少得多。

我还要认真考虑属性是否需要是完整的实体,或者只是商店的属性。例如,除了在地图上显示之外,您是否会使用所有者的名字做任何事情? (而且,是的,我看到你对这个特定事物的评论只是一个例子。)

不幸的是,Core Data并没有提供一种很好的方法来做一个不是关系的多值属性。 (这里的电话号码看起来好像只是一个字符串数组。)虽然可以参考this SO questionthis cocoa-dev thread进行讨论。

答案 2 :(得分:0)

只是在一个基本的层面上,并不多......我无法弄明白你在哪里指定这个,也许当你第一次创建模型时......但是数据的选择之一 - store是.plist, XML用于所有密集目的......

例如......这个“老派”的plist,直接从核心数据模型中提取..

(
Editorial,
News,
Retraction,
"FLAME!",
)

是与此XML集完全相同的数据,一旦运行

/usr/bin/plutil -convert xml1 /../input.plist -o /../output.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <string>Editorial</string>
    <string>News</string>
    <string>Retraction</string>
    <string>FLAME!</string>
</array>
</plist>