我正在学习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。这就是我需要做的。
有没有人有一个如何做到这一点的基本例子?
答案 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 ..)