2014-02-12 32 views
1

据说我理解了NSXMLParser对XML文件的基本解析,我有以下情况,我有几个元素<table_data>...</table_data>,它们对于某个属性的值是不同的,所以,例如:NSXMLParser didStartElement只具有一定的属性

<table_data attr="one">...</table_data> 

<table_data attr="two">...</table_data> 

<table_data attr="three">...</table_data> 

虽然didStartElement,我想解析器考虑到<table_data>元素,只有当它有attr="one"开始元素。

这将意味着在foundCharacters我能得到只有<table_data attr="one">子元素的内容,但不的<table_data attr="two"><table_data attr="three">

到现在为止,我试试这个:

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

    elementoCorrente = [elementName copy]; 

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

     if ([[attributeDict objectForKey:@"attr"] isEqualToString:@"one"]) { 
      stringDesc = [[NSMutableString alloc] init]; 

     } 

    } 

} 


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


    if ([elementoCorrente isEqualToString:@"field"]) { 

     [stringDesc appendString:string]; 
     NSLog(@"%@",string); 
    } 


} 

但什么我得到的是<field>元素的内容的日志,所有的<table_data>的孩子。 有没有办法只打印<field>元素的内容,如果孩子<table_data attr="one">? 感谢 法比奥

回答

3

问题是,你什么都不做,以阻止foundCharacters附加数据为table_data其他事件。你也可以让你的didStartElement保存attributeDict[@"attr"]的值,然后foundCharacters可以检查elementoCorrente以及这个你持有attributeDict[@"attr"]值的新伊娃。例如:

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

    elementoCorrente = nil; 
    atributoCorrente = nil; 

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

     if ([attributeDict[@"attr"] isEqualToString:@"one"]) { 
      elementoCorrente = [elementName copy]; 
      atributoCorrente = [attributeDict[@"attr"] copy]; 
      stringDesc = [[NSMutableString alloc] init]; 
     } 
    } 
} 

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

    if ([elementoCorrente isEqualToString:@"table_data"] && [atributoCorrente isEqualToString:@"one"]) { 

     [stringDesc appendString:string]; 
    } 
} 

坦率地说,你可能要一个didEndElement实现,也可以节省stringDesc无论你想要保存它,然后设置elementoCorrentenil

+0

这在我看来是正确的答案。它是多么容易,是不可思议的。对我感到羞耻......非常感谢Rob花时间为我提供工作代码:)另外,Helderdarocha的答案是有效的,谢谢你们,我现在可以继续! –

1

也许代码片段失去了一些东西,但你是显示什么在这里,打印所有field标签的内容是预期的行为,因为唯一的测试,你做的parser:foundCharacters:方法是,如果当前元素是field

您可以使用attr_one添加一个标志,指示您在table_data之内。喜欢的东西:

if ([[attributeDict objectForKey:@"attr"] isEqualToString:@"one"]) { 
    stringDesc = [[NSMutableString alloc] init]; 
    insideTableOne = YES; 
} 

,然后在parser:foundCharacters:还测试是否insideTableOne是将字符串之前如此。

此测试也是必需的,因此如果程序发现没有预期属性的table_data,它不会崩溃。如果发生这种情况,stringDesc将不会被实例化。

相关问题