2

我想把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>

我不想要每个带有属性的标签的数组,所以有人知道更简单的方法吗?我在网上搜索了这个但找不到解决方案。谢谢你。

4

1 回答 1

2

与其纠缠于 plist 格式,我认为更有趣的问题是,在 Objective-C 中最能代表这种结构的嵌套对象NSArray和集合对象的适当组合是什么。NSDictionary然后,一旦你在嵌套的集合对象中拥有它,你就可以使用该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]是 aNSArray@{key1:value1, key2:value2}是 a 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.

于 2013-08-06T12:06:09.520 回答