NSXMLParser didStartElement只具有某个属性

时间:2014-02-12 23:11:54

标签: ios xml sdk nsxmlparser

据说我理解使用NSXMLParser对XML文件进行基本解析,我有以下情况,其中我有几个元素<table_data>...</table_data>,它们因某个属性的值而彼此不同,所以,例如:

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

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

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

在didStartElement中,我希望解析器仅在<table_data>元素为attr="one"的情况下才将<table_data attr="one">元素作为起始元素考虑在内。

这意味着在foundCharacters中我只能获得<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>的{​​{1}}元素的内容日志。 如果是<field>的孩子,有没有办法只打印<table_data attr="one">元素的内容? 谢谢 法比奥

2 个答案:

答案 0 :(得分:3)

问题在于,您无法阻止foundCharacterstable_data的其他匹配项添加数据。您也可以didStartElement保存attributeDict[@"attr"]值,然后foundCharacters可以检查elementoCorrente以及您持有{{{1}的新ivar 1}}价值。例如:

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设置为elementoCorrente

答案 1 :(得分:1)

也许代码片段缺少某些内容,但是根据您在此处显示的内容,打印所有field代码的内容是预期的行为,因为您在parser:foundCharacters:中进行的唯一测试方法是当前元素是field

您可以添加一个标记,表明您位于table_data attr_one内。类似的东西:

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

然后,在parser:foundCharacters:中测试insideTableOne是否为真,然后再附加字符串。

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