首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查某项是否为空的更好方法?

检查某项是否为空的更好方法?
EN

Stack Overflow用户
提问于 2011-03-10 23:43:37
回答 2查看 331关注 0票数 0

我正在尝试使用TBXML解析XML文件。但是,这个解析器没有内置的错误检查功能,所以如果一个元素不存在,它就会崩溃。下面是我如何解析我的一个XML文件:

代码语言:javascript
复制
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;
}

正如您所看到的,它为每个项目调用了两次。对我来说,这似乎是对开销的巨大浪费。有没有办法不像我现在做的那样,对每一项都做同样的验证?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-10 23:46:49

下面是一个简短的版本:

代码语言:javascript
复制
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;
}

使用枚举器更新的版本:

代码语言:javascript
复制
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;
}

我不确定枚举器版本是否有效,但我想它应该能解决你的问题。

票数 1
EN

Stack Overflow用户

发布于 2011-03-11 00:05:43

你可以这样做:

代码语言:javascript
复制
TBXMLElement *Blah = [TBXML childElementNamed:@"blah" parentElement:XMLRoot];
if (Blah) {
    ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5262059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档