据说我理解使用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">
元素的内容?
谢谢
法比奥
答案 0 :(得分:3)
问题在于,您无法阻止foundCharacters
为table_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
将不会被实例化。