2011-10-10 81 views
0

我目前正試圖解析一些xml數據到NSDictionary。這是我第一次嘗試這樣的事情並感到有點不確定我在做什麼,解析XML到NSMutableDictionary

首先我解析一些XML看起來大致是這樣的 -

<Rows> 
<Row ID="76" MANF="JARD" ISMANUF="F" ISSER="F"/> 
<Row ID="38" MANF ="SANBIN" ISMANUF ="F" ISSER ="T"/> 
<Rows> 

我使用在NSXMLParser代表,所以使用NSLog

NSLog(@"attributes: %@", attributeDict); 

parser:didStartElement:namespaceURI:qualifiedName:attributes:委託方法和我的輸出看起來是這樣的。

} 
2011-10-11 08:01:15.472 Code[526:207] attributes: { 
    ISMANUF = F; 
    ISSER = T; 
    MANF = smart; 
    ID = 74; 
} 
2011-10-11 08:01:15.472 Code[526:207] attributes: { 
    ISMANUF = F; 
    ISSER = T; 
    MANF = "weather guard"; 
    ID = 71; 
} 

現在我正在找這個東西解析爲NSMutableDictionary,但我不是如何去這toatly肯定...我希望做這樣的事情

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict { 
if ([elementName isEqualToString:@"row"]) { 
     myDic = [[myDic alloc] init]; 
     myDic.isManuf = [attributeDict objectForKey:@"ISMANUF"]; 
     myDic.isSer = [attributeDict valueForKey:@"ISSER"]; 
     myDic.Manf = [attributeDict valueForKey:@"MANF"] 
     myDic.id = [attributeDict valueForKey:@"ID"] 
     } 
} 

我的問題就變成了這種看起來正確嗎?然後如果是的話,我該如何在頭文件中聲明這個可變字典?以及如何我宣佈.isManuf .isSer.Manf .id爲此NSMutableDictionary

+0

我可以在方法中使用qualifiedName變量來使它與NSMutableDictionary一起使用嗎? –

回答

1

您必須區分NSObjectNSMutableDictionary的子類。

你寫它的方式,它似乎是一個具有一些屬性的對象。如果你的XML rows總是包含相同的字段,我認爲這是最好的方法。你的對象的屬性是自動「可變的」,所以從這方面沒有什麼可擔心的。

最好使用自定義對象,因爲拼寫錯誤的鍵的錯誤發生的可能性較小,並且代碼通常更具可讀性。

所以你仍然需要knwo如何聲明你的對象:

MyDic.h:

@interface MyDic : NSObject { 
    BOOL isManuf; 
    BOOL isSer; 
    NSString *manf; 
    NSUInteger id; 
} 

@property (nonatomic, assign) BOOL isManuf; 
@property (nonatomic, assign) BOOL isSer; 
@property (nonatomic, retain) NSString *manf; 
@property (nonatomic, assign) NSUInteger id; 

@end 

MyDic.m

@implementation MyDic 
@synthetize isManuf, isSer, manf, id; 

-(void)dealloc { 
    [manf release]; 
    [super dealloc]; 
} 
@end 

而且不要忘了導入自定義對象,並在創建對象時使用類名稱(使用大寫字母)。

#import "MyDic.h" 
.... 
myDic = [[MyDic alloc] init]; 
... 
+0

如果我確實走下了這條路線,是否有可能緩存我的對象,直到數據庫將來會更新數據庫版本等? –

+0

沒關係,所以只要通過這個工作,它不會解決,NSXMLParsing委託只會觸發字符串..所以不太確定從哪裏去。 –

+0

不要明白你的最後一點。如果使用核心數據,該對象將是「NSManagedObject」的一個子類,並且您可以免費獲得Key-Value-Coding的所有優勢。我強烈建議你去用自定義對象。 – Mundi

0

你不想.isManuf,.isSer等等的字典。

您可以:

  • 創建.isManif的Objective-C類,伊塞性能(使用@property和合成)。雖然,我會推薦更多可讀的名稱而不是縮寫名稱 - 不需要匹配xml。
  • 在didStartElement方法中,alloc init自定義對象並分配屬性。
  • 既然你回來了n個,你應該在該類的init(並在頭文件中定義)中創建一個NSMutableArray。將剛剛創建的項目添加到該可變數組中。
  • 當你完成分析時,你有一個在xml中所有對象的可變數組。
+0

你是否這樣做NSMutableDictionary在這種情況下會更好,因爲我將處理大量數據,我想我已經在某處讀過NSDictionarys比較大的數據集更快的速度。 –

+0

當你想查找某個關鍵字時,字典速度非常快 - 但請記住,字典不保留順序。一個NSMutableArray是一個訂單列表,這是xml數據通常所暗含的 - 按特定順序的數據集。由於字典和列表只是根據您的訪問模式存儲對對象的引用,所以有時可以同時存儲 - 有序列表的數組和另一個查找表(字典)以便通過鍵快速訪問。 – bryanmac