2012-02-01 43 views
2

我試圖解析從Web服務器的響應。解析用的NSXMLParser問題

我的解析器確實如下:

#import "XMLParser.h" 
#import "AppDelegate.h" 
#import "Child.h" 

@implementation XMLParser 

- (XMLParser *) initXMLParser { 

    self = [super init]; 

    if(self) 
    { 
     appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    } 
    return self; 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict 
{ 
    if([elementName isEqualToString:@"GetKidsResult"]) 
    { 
     // initialize the array 
     if(!appDelegate.children) 
     { 
      appDelegate.children = [[NSMutableArray alloc] init]; 

     } 

    } 

    else if([elementName isEqualToString:@"a:KeyValueOfintKidf4KEWLbb"]) 
    { 
     if(!aChild) 
     { 
     //Initialize the child. 
      aChild = [[Child alloc] init]; 
     } 
    } 

    NSLog(@"Processing Element: %@", elementName); 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    if(!currentElementValue) 
    { 
     currentElementValue = [[NSMutableString alloc] initWithString:string]; 
    } 
    else 
    { 
     [currentElementValue appendString:string]; 
    } 

} 

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    //NSLog(@"El name: %@", elementName); 

    if([elementName isEqualToString:@"GetKidsResult"]) 

     NSLog(@"end of xml"); 
     return;  

    if([elementName isEqualToString:@"a:KeyValueOfintKidf4KEWLbb"]) 
    { 
     NSLog(@"Found end of child"); 

     [appDelegate.children addObject:aChild]; 

     aChild = nil; 
    } 

    else if([elementName isEqualToString:@"a:Key"]) 
    { 
     NSLog(@"Found key"); 
    } 

    else if([elementName isEqualToString:@"b:CheckedIn"]) 
    { 
     NSLog(@"Found checkedIn"); 
    } 

    else if([elementName isEqualToString:@"b:FirstName"]) 
    { 
     NSLog(@"Found firstname"); 
    } 

    else if([elementName isEqualToString:@"b:Gender"]) 
    { 
     NSLog(@"found gender"); 
    } 

    else if([elementName isEqualToString:@"b:Id"]) 
    { 
     NSLog(@"found id"); 
    } 

    else if([elementName isEqualToString:@"b:IsOnTour"]) 
    { 
     NSLog(@"found isontour"); 

    } 

    else if([elementName isEqualToString:@"b:LastName"]) 
    { 
     NSLog(@"found lastname"); 
    } 

    else if([elementName isEqualToString:@"b:GroupName"]) 
    { 
     NSLog(@"found groupname"); 
    } 

    currentElementValue = nil; 

} 
@end 

現在我只是想看看,如果發現數據...然後我將它保存之後... 但在我didEndElement,它似乎沒有找到比

if([elementName isEqualToString:@"GetKidsResult"]) 

我的XML響應的例子以外的任何其他:

  <a:KeyValueOfintKidf4KEWLbb> 
      <a:Key>XXXXXXXX</a:Key> 
      <a:Value xmlns:b="http://schemas.datacontract.org/2004/07/DayCare.DB.DTO"> 
       <b:CheckedIn>false</b:CheckedIn> 
       <b:FirstName>XXXXXXX</b:FirstName> 
       <b:Gender>Male</b:Gender> 
       <b:Id>XXXXXXXX</b:Id> 
       <b:IsOnTour>false</b:IsOnTour> 
       <b:LastName>XXXXXX</b:LastName> 
       <b:Photo>XXXXXXXX</b:Photo> 
       <b:GroupName>XXXXX</b:GroupName> 
      </a:Value> 
     </a:KeyValueOfintKidf4KEWLbb> 

爲什麼它不包含其他元素? 我從來沒有做過Web服務和這樣的過,所以更簡單的解釋,好...

當我NSLog的元素,我可以看到,它通過XML文檔正確

NSLog(@"Processing Element: %@", elementName); 

實施例:

Processing Element: a:KeyValueOfintKidf4KEWLbb 
Processing Element: a:Key 
Processing Element: a:Value 
Processing Element: b:CheckedIn 
Processing Element: b:FirstName 
Processing Element: b:Gender 
Processing Element: b:Id 
Processing Element: b:IsOnTour 
Processing Element: b:LastName 
Processing Element: b:Photo 
Processing Element: b:GroupName 

回答

3

didEndElement,嘗試改變這一部分:

if([elementName isEqualToString:@"GetKidsResult"]) 

    NSLog(@"end of xml"); 
    return; 

到:

if([elementName isEqualToString:@"GetKidsResult"]) 
{ 
    NSLog(@"end of xml"); 
    return; 
} 

沒有把if後,這兩個語句塊中,return獲取每次執行。

+0

D'哦:在我結束d愚蠢的錯誤......原本的NSLog是不存在,所以這不是一個問題,但忘了塊添加的NSLog後加...謝謝:) – user969043 2012-02-01 13:35:32

+0

威爾在5分鐘內接受答案:) stackoverflow不會讓我接受它早於此...但謝謝! – user969043 2012-02-01 13:36:35

+1

這就是爲什麼總是封閉積木「{」是一個很好的初步實踐 – 2012-02-01 13:38:26