NSXMLParser didStartElement只具有一定的属性
据说我理解了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">
? 感谢 法比奥
问题是,你什么都不做,以阻止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
无论你想要保存它,然后设置elementoCorrente
到nil
。
也许代码片段失去了一些东西,但你是显示什么在这里,打印所有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
将不会被实例化。
这在我看来是正确的答案。它是多么容易,是不可思议的。对我感到羞耻......非常感谢Rob花时间为我提供工作代码:)另外,Helderdarocha的答案是有效的,谢谢你们,我现在可以继续! –