2012-09-28 2 views
-1

Iam이 XML 응답을 소비하고 구문 분석합니다. 그러나 NSMutableDictionary에 객체를 추가 한 다음 nSMutableArray에 객체를 추가하면 응답이 null입니다.null을 반환하는 NSMutableArray에 NSMutableDictionary를 추가합니다.

<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 

그리고 내 구문 분석 코드는 다음과 같다 : 내 Xmlresponse이 같다

- (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을 반환합니까? 그렇습니까?

+0

안녕하세요, 왜 대답을 모르십니까? 물어 보았습니다. 제발 도와주세요. iPhone 개발에 상당히 익숙하며 많은 것을 검색 한 후에 여기에 게시했습니다. 몇 가지 예를 보았습니다. 하지만 내 컨텍스트에서 그들을 적용하는 방법을 모르겠다. 그래서 내가 도와 줬어 ... 제발 도와주세요 – cutiepie

답변

0

있는 viewDidLoad에서 인스턴스 변수를 초기화하십시오

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에서 그들을 추가 한 내가 말했듯이 "프로그램 수신 신호 SIGABRT"에서 오류가 발생했습니다 setObject : srr forKey : @ "City"]; Y 그럴 수 있니? – cutiepie

0

XML을 사용하기 전에 유효성을 검사됩니다 때문에 online at 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

이봐, 내가 그것을 확인했습니다. 오류가 없습니다 .XML 파일이 정확합니다. 그것은 말합니다 : 오류 없음을 발견 – cutiepie

+0

헤이하지만 나를 위해 일하지 .... 나는 srr = [[NSMutableString alloc] 초기화]; 행운 – cutiepie

+0

안녕하세요 고마워요 ur 도움을 위해 ..하지만 하나의 사전 값이 추가됩니다. 미시간 점점 오전 윌리엄스. 나는 다른 ......... Y 지 않습니다? – cutiepie