Простой способ удалить теги в Obj-C - PullRequest
1 голос
/ 12 ноября 2009

Я только изучаю цель-c и разработку для iPhone, и я действительно борюсь с некоторыми очень простыми задачами. Я только на 3-й день учебного процесса - так что это следует ожидать несколько. Мне все еще стыдно задавать такой простой вопрос.

Во всяком случае, вот мой вопрос. У меня есть веб-сервис .NET, который я вызываю, используя GET для http://somehost/ping

возвращает «понг»

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

Самый простой из тестовых случаев.

Вернитесь на iPhone, когда я получу URL, в результате у меня получится строка выше. Я хочу только часть понга. Это похоже на программирование 101, но я не могу найти простой пример того, как это сделать, не включающий определение делагатов или других, казалось бы, сложных этапов обработки.

Проблема достаточно проста: найдите первое «>» и извлеките все оттуда до первого «<» в виде строки NSString. Это все, что мне нужно сделать. </p>

У кого-нибудь есть базовый пример того, как это сделать?

Ответы [ 3 ]

3 голосов
/ 12 ноября 2009

Это сухой код, и вроде уродливо имхо. Но вот более прямой ответ.

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

xml = [xml substringFromIndex:range.location + 1];
range = [substring rangeOfString:@"<"];
xml = [xml substringToIndex:range.location];
1 голос
/ 12 ноября 2009

Иногда полный синтаксический анализ 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 ..)

1 голос
/ 12 ноября 2009

Привет, Сильванаар, мне приходится делать подобные типы внутри клиента. Моя общая методология парсинга 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;    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...