我想将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>
我不希望每个带有属性的标签都有一个数组,所以有人知道更简单的方法吗?我在网上搜索了此问题但找不到解决方案。谢谢。
最佳答案
我认为更有趣的问题是嵌套 NSArray
的适当组合是什么,而不是纠缠于 plist 格式。和NSDictionary
在 Objective-C 中最能代表这种结构的集合对象。然后,一旦将其放入嵌套集合对象中,您就可以使用 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
带三把 key ,name
, price
,和color
。这三个值本身就是 NSDictionary
对象,但有两个键,value
并且,如果合适的话,attributes
。因此,如果您要在代码中手动表示生成的一系列嵌套对象,它可能看起来像(其中 @[a, b, c]
是 NSArray
, @{key1:value1, key2:value2}
是 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"]
。如果您想要第一个对象的语言名称,它将是 array[0][@"name"][@"attributes"][@"language"]
。一旦开始使用这种嵌套集合对象结构,您就会明白(a)为什么我更喜欢字典而不是数组;也是为什么 (b) 无论是否有属性,我都使用相同的字典结构,这样检索值的过程始终是一致的。
无论如何,如果我现在使用 writeToFile
方法,这恰好会产生一个像这样的 plist:
<?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。我只是将 XML 加载到嵌套数组和字典的结构中,然后使用 writeToFile
生成plist文件。当我想使用该 plist 时,我现在可以通过一次调用 arrayWithContentsOfFile
来读取它。 .
关于ios - 将 xml 转换为 plist - xml 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18078372/