2013-08-06 105 views
1

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

示例XML:

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

据我所知,的.plist文件犯规提供的属性,所以我能做些什么来防止这样的的.plist:

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

我不想用属性每个标签的数组,因此,没有人知道一个simplier的方法吗?我搜索了这个网页,但无法找到解决方案。谢谢。

回答

1

我认为更有趣的问题是嵌套的NSArrayNSDictionary集合对象的合适组合,它最能代表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着三把钥匙,namepricecolor。这三个值本身是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文件。当我想使用那个pl​​ist时,我现在可以通过一个电话arrayWithContentsOfFile来阅读它。

+0

这是伟大的,谢谢你的时间! – dan