ios - 将 xml 转换为 plist - xml 属性?

标签 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>

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

最佳答案

我认为更有趣的问题是嵌套 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/

相关文章:

ios - 静默配对 iBeacon

ios - 可以填充选择器 View 但不能从中获取数据

java - 即将将(Java)库移植到 Objective-C : Methodology?

jquery - 如何使用ajax从另一个div(如iFrame)填充div中的xml文档?

ios - XCode 6 beta 7 快速错误

ios - Apple LLVM Compiler 4.2错误:没有这样的文件或目录

ios - 在 objective-c 中进行类型转换,(NSInteger) VS。整数值

ios - 从iPhone的Watch触发搜寻

PHP、MySQL - 加载大约 100k 记录并将其导出到 xml

java - 使用 JDOM 在 Java 中构建包含我的 FIX 订单的 .XML 文件