2012-01-16 73 views
0

解析我有这样一个XML文件:用的NSXMLParser

<name>Alberto</name> 
<subname>Martín</subname> 
<age>24</age> 

我想的NSXMLParser解析器,并将其保存数据:

NSString *name; 
NSString *subname; 
NSString *age; 

要做到这一点即时通讯使用:

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

if([elementName isEqualToString:@"name"]) 
{ 
    if (!soapResults) 
    { 
     soapResults = [[NSMutableString alloc] init]; 

} 

    elementoEncontrado = YES; 
}} 

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

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

if ([elementName isEqualToString:@"name"]) 
{ 
    name=soapResults; 
} 
if ([elementName isEqualToString:@"subname"]) 
{ 
    subname=soapResults; 
} 
    if ([elementName isEqualToString:@"age"]) 
{ 
    age=soapResults; 
} 


NSLog(@"%@", name, subname, age); 

问题是子名和年龄从不出现...

+0

所有这些线来分析一个非常简单的XML?为什么不使用一个叫做TBXML的简单库(http://tbxml.co.uk) – Saurabh 2012-01-16 17:53:53

回答

1

您应该检查这里的所有元素,因为您只为name元素创建NSMutableString。

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

    if([elementName isEqualToString:@"name"]) 
    { 
     if (!soapResults) 
     { 
      soapResults = [[NSMutableString alloc] init]; 
     } 

     elementoEncontrado = YES; 
    } 
} 

和发布/零您soapResults这里,以及设置你的elementoEncontradoNO这里

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

    if ([elementName isEqualToString:@"name"]) 
    { 
     // copy or retain this, unless ARC. 
     name=soapResults; 
    } 

    if ([elementName isEqualToString:@"subname"]) 
    { 
     subname=soapResults; 
    } 

    if ([elementName isEqualToString:@"age"]) 
    { 
     age=soapResults; 
    } 
    NSLog(@"%@", name, subname, age); 
    [soapResults release]; 
    soapResults = nil; 

    elementoEncontrado = NO; 
} 
+0

好的朋友,谢谢。将NSString复制到另一个,这是这种情况下最好的形式? name = [copy soapResults]或[name release] name = [NSString stringWthString:theName] ???或其他形式? – 2012-01-16 21:01:45

+0

我认为这个名字= [soapResults copy];应该工作得很好。同样,如果不在ARC下,请记住稍后再发布这些实例。 – 2012-01-16 21:11:36