2012-09-28 74 views
-1

Iam使用XML響應並解析它..但是,當Iam將對象添加到NSMutableDictionary,然後添加到nSMutableArray時,響應爲null。我無法理解Iam出錯的位置? 我Xmlresponse是這樣的:將NSMutableDictionary添加到NSMutableArray返回null

<List> 
<Address> 
    <City>Michigan</City> 
    <Line1>17</Line1> 
    <line2>12</Line2> 
</Address> 
<Employee> 
    <EmployeeName>Williams</EmployeeName> 
</Employee> 
<Address> 
    <City>NewYork</City> 
    <Line1>27</Line1> 
    <line2>52</Line2> 
</Address> 
<Employee> 
    <EmployeeName>Mandarin</EmployeeName> 
</Employee> 

我的回答應該是這樣的:

Michigan 
17 
12 
Williams 

NewYork 
27 
52 
Mandarin 

和我的解析代碼是這樣的:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 

element = elementName; 
if([elementName isEqualToString:@"Address"]) 
    { 
     arr=[[NSMutableArray alloc] init]; 
     drr=[[NSMutableDictionary alloc] init]; 


    } 

} 

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 
[srr appendString:string]; 
} 


- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 

if([elementName isEqualToString:@"City"]) 
{ 
    [drr setObject:srr forKey:@"City"]; 
    [srr release],srr=nil; 
    return; 
} 

if([elementName isEqualToString:@"Line1"]) 
{ 

    [drr setObject:srr forKey:@"Line1"]; 
    [srr release],srr=nil; 
    return;  
} 
if([elementName isEqualToString:@"Line2"]) 
    { 

     [drr setObject:srr forKey:@"Line2"]; 
     [srr release],srr=nil; 
     return;  
    } 

if([elementName isEqualToString:@"Address"]) 
{ 
    [arr addObject:drr]; 
    [drr release],drr=nil; 


} 
[srr release],srr=nil; 
} 
NsLog(@"%@",arr); 

但是,當我檢查'arr'處的響應是否返回NULL?是這樣嗎?Iam我錯了嗎?

+0

哎爲什麼你會低調投票?我真的不知道答案。所以我問過......請幫助。我對iPhone開發很感興趣,並在搜索了很多後我發佈在這裏。我遇到了一些例子但不知道如何將它們應用在我的上下文中。所以我問了...請幫助 – cutiepie

回答

0

請viewDidLoad中初始化你的ivars

arr=[[NSMutableArray alloc] init]; 
     drr=[[NSMutableDictionary alloc] init]; 

因爲

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 

被當每個元素被解析調用,因此它被再一次重新分配,並又一次

+0

正如你所說我已將它們添加到ViewDidLoad.Now Iam在[drr setObject:srr forKey: @「城市」];是嗎? – cutiepie

0

之前使用XML驗證它在線http://www.w3schools.com/xml/xml_validator.asp 首先你的XML有錯誤使用這一個

<List> 
    <Address> 
    <City>Michigan</City> 
    <Line1>17</Line1> 
    <Line2>12</Line2> 
    </Address> 
    <Employee> 
     <EmployeeName>Williams</EmployeeName> 
    </Employee> 
    <Address> 
     <City>NewYork</City> 
     <Line1>27</Line1> 
     <Line2>52</Line2> 
    </Address> 
    <Employee> 
     <EmployeeName>Mandarin</EmployeeName> 
    </Employee> 
</List> 
You were writing <line2>12</Line2> , <line2>52</Line2> instead of <Line2>12</Line2> ,   <Line2>52</Line2> 
    and missing </List> 
And also initialize srr every time in Method 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:  (NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 

// element = elementName; 
if([elementName isEqualToString:@"Address"]) 
{ 
    arr=[[NSMutableArray alloc] init]; 
    drr=[[NSMutableDictionary alloc] init]; 
} 
**srr = [[NSMutableString alloc] init];** 
} 
I tested it, working fine for me 

Use this code for your Parser.m Class 
just initialize arr array in init method 

#import "Parser.h" 

@interface Parser() { 
    NSMutableArray *arr; 
    NSMutableDictionary *drr; 
    NSMutableString *srr; 
} 

@end 

@implementation Parser 

-(id)initParser 
{ 
    if(self == [super init]) { 
    arr = [[NSMutableArray alloc] init]; 
} 
return self; 
} 

- (void)dealloc 
{ 
    [arr release]; 
    [super dealloc];  
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 

    // element = elementName; 
    if([elementName isEqualToString:@"Address"] || [elementName isEqualToString:@"Employee"]) { 
    drr = [[NSMutableDictionary alloc] init]; 
    } 

    srr = [[NSMutableString alloc] init]; 
} 

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    [srr appendString:string]; 
} 


- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 

    if([elementName isEqualToString:@"City"]) { 

    [drr setObject:srr forKey:@"City"]; 
    [srr release],srr=nil; 
    return; 
} 

if([elementName isEqualToString:@"Line1"]) { 

    [drr setObject:srr forKey:@"Line1"]; 
    [srr release],srr=nil; 
    return;  
} 

if([elementName isEqualToString:@"Line2"]) { 

    [drr setObject:srr forKey:@"Line2"]; 
    [srr release],srr=nil; 
    return;  
} 
if([elementName isEqualToString:@"EmployeeName"]) { 

    [drr setObject:srr forKey:@"EmployeeName"]; 
    [srr release],srr=nil; 
    return;  
} 

if([elementName isEqualToString:@"Address"] || [elementName isEqualToString:@"Employee"]) { 
    [arr addObject:drr]; 
    [drr release],drr=nil; 
} 

    [srr release],srr=nil; 
} 

- (void)display { 
    NSLog(@"%@",arr); 
} 

@end 
+0

嘿,我檢查了它。沒有errors.XML文件是正確的。它說:沒有發現錯誤 – cutiepie

+0

嘿,但它不工作....我增加了srr = [[NSMutableString alloc] init];仍然沒有運氣 – cutiepie

+0

嘿非常感謝您的幫助..但只有一個字典值添加Iam得到密歇根威廉姆斯。我沒有得到其他......... Y? – cutiepie

相關問題