I just love it when you need something simple and easy that perfectly suits your needs. I needed some lightweight XML parser for iOS, and I found it.
To be honest (since I’m coming from java background), I didn’t quite fall in love with objective-c at first, and it seemed to be that I needed a lot more code to make some basic stuff work. For example XML parsing. NSXMLParser is ok, but it’s event driven (link #1, link #2). I wanted some dead simple DOM parser.
So the whole library is just two classes SMXMLElement and SMXMLDocument. To show you how simple it is to parse a file, here is a (reduced) snippet from my application:
- (void) parseData:(NSData *) { NSError *error; SMXMLDocument *document = [SMXMLDocument documentWithData:data error:&error]; // check for errors if (error) { DDLogError(@"Error while parsing the document: %@", error); return nil; } // Array of objects that we are returning NSMutableArray *result = [[NSMutableArray alloc] init]; // Get the videos node SMXMLElement *videos = document.root; // Go through every sub-element "video" for (SMXMLElement *video in [videos childrenNamed:@"video"]) { VideoInfo *info = [[VideoInfo alloc] init]; info.name = ; // Get other values from XML... [result addObject:info]; [info release]; } return result; }
A shorter version of XML that the code above parses is:
<videos> <video> <name>Yup, this a name of a video</name> </video> <video> <name>And another one :)</name> </video> </videos>
As you can see I’m only using (NSString*) valueWithPath:(NSString *) here, but there are a couple more
- (SMXMLElement *)childNamed:(NSString *)name; - (NSArray *)childrenNamed:(NSString *)name; - (SMXMLElement *)childWithAttribute:(NSString *)attributeName value:(NSString *)attributeValue; - (NSString *)attributeNamed:(NSString *)name; - (SMXMLElement *)descendantWithPath:(NSString *)path; - (NSString *)valueWithPath:(NSString *)path;
Do you really need anything else (in some small applications)? :)
Really awesome, kudos to the creators.