2013-08-06 109 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