我想将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>
我不希望每个带有属性的标签都有一个数组,所以有人知道更简单的方法吗?我在网上搜索但无法找到解决方案。谢谢。
答案 0 :(得分:1)
我认为更有趣的问题是,在Objective-C中最能代表这种结构的嵌套NSArray
和NSDictionary
集合对象的适当组合,而不是沉溺于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
,有三个密钥,name
,price
和color
。这三个值本身就是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文件。当我想使用那个plist时,我现在可以通过一次调用writeToFile
来阅读它。