Вы должны использовать NSXMLParser
. Создайте экземпляр в своем коде и скажите, чтобы он проанализировал:
NSData * XMLData = [myXMLString dataUsingEncoding:NSUnicodeStringEncoding];
NSXMLParser * parser = [[NSXMLParser alloc] initWithData:XMLData];
[parser setDelegate:self];
[parser setShouldProcessNamespaces:YES]; // if you need to
[parser parse]; // start parsing
тогда вам нужно реализовать методы NSXMLParserDelegate
для получения обратных вызовов при разборе:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict{
/* handle namespaces here if you want */
if([elementName isEqualToString:@"puid"]){
NSString * ID = [attributeDict objectForKey:@"id"];
// use ID string, or store it in an ivar so you can access it somewhere else
}
}
Замечания по обработке пространств имен:
Если заданы пространства имен, elementName
- это полное имя, поэтому может иметь префикс (например, mip:puid
). Если вы на Mac, NSXMLNode
имеет методы класса удобства, localNameForName:
и prefixForName:
чтобы получить две части строки.
Кроме того, вам могут потребоваться NXXMLParser
методы делегата parser:didStartMappingPrefix:toURI:
и parser:didEndMappingPrefix:
.
Обратите внимание, что имена, возвращаемые NSXMLParser
, в точности совпадают с именами строки (относительно того, имеют ли они префикс). Так что атрибут редко называют mip:id
, но если вы хотите быть устойчивым, вам также необходимо проверить это.