我正在尝试使用TBXML解析XML文件。但是,这个解析器没有内置的错误检查功能,所以如果一个元素不存在,它就会崩溃。下面是我如何解析我的一个XML文件:
TBXML *XML = [[TBXML tbxmlWithXMLData:myxmlfile] retain];
if (XML.rootXMLElement) {
TBXMLElement *XMLRoot = XML.rootXMLElement;
if ([TBXML childElementNamed:@"blah" parentElement:XMLRoot]) {
TBXMLElement *Blah = [TBXML childElementNamed:@"blah" parentElement:XMLRoot];
if ([TBXML childElementNamed:@"stuff" parentElement:Blah]) {
TBXMLElement *Item = [TBXML childElementNamed:@"item" parentElement:Blah;
if ([TBXML childElementNamed:@"stuff:blah" parentElement:Item]) {
TBXMLElement *something = [TBXML childElementNamed:@"stuff:blah" parentElement:Item];
NSString *Something = [TBXML textForElement:something];
//do something here...
}
else {
[self showFetchError];
[XML release];
return;}
} else {
[self showFetchError];
[XML release];
return;}
} else {
[self showFetchError];
[XML release];
return;}
} else {
[self showFetchError];
[XML release];
return;
}正如您所看到的,它为每个项目调用了两次。对我来说,这似乎是对开销的巨大浪费。有没有办法不像我现在做的那样,对每一项都做同样的验证?
发布于 2011-03-10 23:46:49
下面是一个简短的版本:
BOOL success = NO;
TBXML *XML = [[TBXML tbxmlWithXMLData:myxmlfile] retain];
if (XML.rootXMLElement) {
TBXMLElement *XMLRoot = XML.rootXMLElement;
if ([TBXML childElementNamed:@"blah" parentElement:XMLRoot]) {
TBXMLElement *Blah = [TBXML childElementNamed:@"blah" parentElement:XMLRoot];
if ([TBXML childElementNamed:@"stuff" parentElement:Blah]) {
TBXMLElement *Item = [TBXML childElementNamed:@"item" parentElement:Blah;
if ([TBXML childElementNamed:@"stuff:blah" parentElement:Item]) {
success = YES;
TBXMLElement *something = [TBXML childElementNamed:@"stuff:blah" parentElement:Item];
NSString *Something = [TBXML textForElement:something];
//do something here...
}
}
}
}
if (!success) {
[self showFetchError];
[XML release];
return;
}使用枚举器更新的版本:
TBXML *XML = [[TBXML tbxmlWithXMLData:myxmlfile] retain];
NSArray *path = [NSArray arrayWithObjects:@"blah", @"item", @"stuff:blah", nil];
NSEnumerator *e = [path objectEnumerator];
TBXMLElement *currentNode = XML.rootXMLElement;
BOOL success = NO;
while ((NSString *node = [e nextObject]) && currentNode) {
if ([node isEqualToString:[path lastObject]]) {
success = YES;
NSString *Something = [TBXML textForElement:currentNode];
// do the last element thing with string
} else {
currentNode = [TBXML childElementNamed:node parentElement:currentNode];
}
}
if (!success) {
[self showFetchError];
[XML release];
return;
}我不确定枚举器版本是否有效,但我想它应该能解决你的问题。
发布于 2011-03-11 00:05:43
你可以这样做:
TBXMLElement *Blah = [TBXML childElementNamed:@"blah" parentElement:XMLRoot];
if (Blah) {
...
}https://stackoverflow.com/questions/5262059
复制相似问题