将xml转换为plist - xml属性?

时间:2013-08-06 11:01:28

标签: ios objective-c xml plist

我想将xml文件转换为plist文件,但我不知道如何保存xml属性的信息<tag attribute="value"></tag>

示例xml:

<root>
     <tag attribute="value">Stackoverflow</tag>
</root>

据我所知,.plist文件不提供属性,所以我该怎样做才能阻止像这样的.plist:

<root>
     <array>
          <item>StackOverflow</item>
          <item>value</item>
     </array>
</root>

我不希望每个带有属性的标签都有一个数组,所以有人知道更简单的方法吗?我在网上搜索但无法找到解决方案。谢谢。

1 个答案:

答案 0 :(得分:1)

我认为更有趣的问题是,在Objective-C中最能代表这种结构的嵌套NSArrayNSDictionary集合对象的适当组合,而不是沉溺于plist格式。然后,一旦在嵌套的集合对象中拥有它,就可以使用writeToFile方法自动生成plist文件。

现在你说你不想要一个“带有属性的每个标签的数组”。首先,我不会建议一个数组,但我实际上建议一个字典。其次,这正是我认为你想要的,每个标签的一致,可理解的表示。第三,我建议你不要只对带有属性的标签这样做,但我甚至可以为所有标签做这些。

我不确定你为什么说你不想为每个标签使用一个数组,但是虽然它看起来效率低下,但事实证明这样做要容易得多,因为那样你的结构就会在一致,易于使用的格式。

最简单的解决方案是为XML源中的每个元素设置一个字典,一个键为@"value",另一个键为@"attributes"(如果存在,则可以省略attributes没有)。

想象一下以下XML:

<produce>
    <product>
        <name language="English">Apple</name>
        <price currency="USD">1.23</price>
        <color>red</color>
    </product>
    <product>
        <name language="English">Banana</name>
        <price currency="USD">2.63</price>
        <color>yellow</color>
    </product>
</produce>

我建议你有一系列产品,每个产品都是NSDictionary,有三个密钥,namepricecolor。这三个值本身就是NSDictionary个对象,但有两个键value,如果合适,还有attributes。因此,如果您要在代码中手动表示生成的一系列嵌套对象,它可能看起来像(@[a, b, c]NSArray@{key1:value1, key2:value2}是{{1} }):

NSDictionary

虽然看起来很复杂,但它实际上非常容易使用。如果你想要第二个对象,那就是NSArray *array = @[ @{ @"name": @{ @"value" : @"Apple", @"attributes" : @{@"language":@"English"} }, @"price": @{ @"value" : @1.23, @"attributes" : @{@"currency":@"USD"} }, @"color": @{ @"value" : @"red" } }, @{ @"name": @{ @"value" : @"Banana", @"attributes" : @{@"language":@"English"} }, @"price": @{ @"value":@1.46, @"attributes":@{@"currency":@"USD"} }, @"color":@{@"value":@"yellow"} } ]; 。如果你想要第二个对象的颜色,它将是array[1]。如果您想要第一个对象的语言名称,那么它将是array[1][@"color"][@"value"]。一旦开始使用这个嵌套的集合对象结构,你可以看到(a)为什么我更喜欢字典到数组;还有为什么(b)我使用相同的字典结构是否存在属性,这样一来,检索值的过程始终是一致的。

无论如何,如果我现在使用array[0][@"name"][@"attributes"][@"language"]方法,那就会产生这样的plist:

writeToFile

但好消息是,我不必自己写一个plist。我只是将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> <dict> <key>color</key> <dict> <key>value</key> <string>red</string> </dict> <key>name</key> <dict> <key>attributes</key> <dict> <key>language</key> <string>English</string> </dict> <key>value</key> <string>Apple</string> </dict> <key>price</key> <dict> <key>attributes</key> <dict> <key>currency</key> <string>USD</string> </dict> <key>value</key> <real>1.23</real> </dict> </dict> <dict> <key>color</key> <dict> <key>value</key> <string>yellow</string> </dict> <key>name</key> <dict> <key>attributes</key> <dict> <key>language</key> <string>English</string> </dict> <key>value</key> <string>Banana</string> </dict> <key>price</key> <dict> <key>attributes</key> <dict> <key>currency</key> <string>USD</string> </dict> <key>value</key> <real>1.46</real> </dict> </dict> </array> </plist> 生成plist文件。当我想使用那个pl​​ist时,我现在可以通过一次调用writeToFile来阅读它。