在Obj-C中剥离标签的简单方法

时间:2009-11-12 15:01:39

标签: iphone objective-c

我正在学习Objective-c和iPhone开发,我真的在努力完成一些非常基本的任务。我只是在学习过程的第3天 - 所以这是有所期待的。提出这么简单的问题,我仍然感到羞耻。

无论如何,这是我的问题。我有一个.NET Web服务,我使用GET调用http://somehost/ping

它返回'pong'

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">pong</string>

最简单的测试用例。

当我检索URL时,回到iPhone上,结果我有上面的字符串。我只想要'乒乓'部分。这看起来像编程101,但我似乎无法找到一个如何做的简单示例,不涉及定义delagates或其他看似复杂的处理步骤。

问题很简单,找到第一个'&gt;'并从那里提取所有内容,直到第一个'&lt;'作为NSString。这就是我需要做的。

有没有人有一个如何做到这一点的基本例子?

3 个答案:

答案 0 :(得分:3)

这是干编码的,有点丑陋的imho。但这是一个更直接的答案。

NSString *xml = @"<tag>pong</tag>";
NSRange range = [xml rangeOfString:@">"];

xml = [xml substringFromIndex:range.location + 1];
range = [substring rangeOfString:@"<"];
xml = [xml substringToIndex:range.location];

答案 1 :(得分:1)

Hey Sylvanaar,我不得不在客户端内部进行类似的解析。我解析xml响应的一般方法就像这样。我很确定这些课程也可以在iphone方面使用。注意:它可能不是绝对最好的方法,但它确实有效。

- (id)initWithXMLNode:(NSXMLNode *)node {
    self = [super init];

    if (self != nil) {
        NSError *error;
        NSArray *objects;

        // Get the fingerprint
        objects = [node objectsForXQuery:@"for $fingerprint in ./Fingerprint return data($fingerprint)" error:&error];
        handleErrorInInit(error)

        fingerprint = getFingerprint(objects);

        // Get the moduleName
        objects = [node objectsForXQuery:@"for $moduleName in ./Foldername return data($moduleName)" error:&error];
        handleErrorInInit(error)

        moduleName = getNSString(objects);
    }

    return self;
}

值得展示这一点。请注意,NSXMLDocuments是NSXMLNodes的子类。

- (NSXMLDocument *)xmlDocumentFromData:(NSData *)data {
    NSError *error; 
    NSXMLDocument *document = [[[NSXMLDocument alloc] initWithData:data options:0 error:&error] autorelease];

    if (error) {
        [NSApp presentError:error];
        return nil;
    }   

    return document;    
}

答案 2 :(得分:1)

有时完整的XML解析是有道理的,但快速索引/子串例程也是合适的:

NSRange startBracket = [xmlFragment rangeOfString:@">"];
if(startBracket.location != NSNotFound) {
    NSRange endBracket = [xmlFragment rangeOfString:@"<" 
                                  options:0 
                                  range:NSMakeRange(startBracket.location, 
                                  [xmlFragment length] - startBracket.location)];
    if(endBracket.location != NSNotFound) {
        NSString *value = [[xmlFragment substringFromIndex:startBracket.location+1] 
                            substringToIndex:endBracket.location];
        // Do something with value...
    }
}   

(未经测试,需要更多错误处理,yadda yadda yadda ..)