代码之家  ›  专栏  ›  技术社区  ›  sylvanaar

在obj-c中去除标签的简单方法

  •  1
  • sylvanaar  · 技术社区  · 15 年前

    我只是在学习Objective-C和iPhone开发,我真的很难完成一些非常基本的任务。我只是学习过程中的第三天,所以这在一定程度上是可以预料的。问这么简单的问题,我还是觉得羞愧。

    不管怎样,这是我的问题。我有一个.NET Web服务,我用get调用它 http://somehost/ping

    它返回“pong”

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

    最简单的测试用例。

    回到iPhone上,当我检索到URL时,我得到了上面的字符串。我只想要“乒乓”部分。这看起来像是编程101,但我似乎找不到一个简单的例子来说明如何做到这一点,它不涉及定义延迟或其他看似复杂的处理步骤。

    问题很简单,找到第一个“>”,然后从中提取所有内容,直到第一个“<”作为nsstring。这就是我要做的。

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

    3 回复  |  直到 15 年前
        1
  •  3
  •   Bryan McLemore    15 年前

    这是干编码的,有点难看。但这里有一个更直接的答案。

    NSString *xml = @"<tag>pong</tag>";
    NSRange range = [xml rangeOfString:@">"];
    
    xml = [xml substringFromIndex:range.location + 1];
    range = [substring rangeOfString:@"<"];
    xml = [xml substringToIndex:range.location];
    
        2
  •  1
  •   Bryan McLemore    15 年前

    嘿,Sylvanar,我必须在客户机内部进行类似类型的解析。我分析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;    
    }
    
        3
  •  1
  •   jasondoucette    15 年前

    有时完全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….)