#import <Cocoa/Cocoa.h>

@interface AOSParser : NSObject {
    NSMutableString *capturedCharacters;
    BOOL captureCharacters;

    NSString *text;
    NSMutableArray *items;
}

- (NSMutableArray *)parseXMLData:(NSData *)data parseError:(NSError **)error;

// NSXMLParserDelegate methods
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
@end

@implementation AOSParser

- (NSMutableArray *)parseXMLData:(NSData *)data parseError:(NSError **)error {
    items = [NSMutableArray array];

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    [parser setDelegate:self];
    [parser setShouldProcessNamespaces:NO];
    [parser setShouldReportNamespacePrefixes:NO];
    [parser setShouldResolveExternalEntities:NO];
    
    [parser parse];
    
    if (error && [parser parserError]) {
        *error = [parser parserError];
    }

    //[parser release]; // Seems to be auto-released

    return [items retain];
}

- (void)parser:(NSXMLParser *)parser
        didStartElement:(NSString *)elementName
        namespaceURI:(NSString *)namespaceURI
        qualifiedName:(NSString *)qualifiedName
        attributes:(NSDictionary *)attributeDict {
        
    //NSLog(@"<%@>", elementName);

    if ([elementName isEqual:@"string"]) {
        captureCharacters = YES;
        capturedCharacters = [NSMutableString string];
    }

}

- (void)parser:(NSXMLParser *)parser
        foundCharacters:(NSString *)string {

    //NSLog(@"Text: %@", string);

    if (captureCharacters) {
        [capturedCharacters appendString:string];
    }
}

- (void)parser:(NSXMLParser *)parser
        didEndElement:(NSString *)elementName
        namespaceURI:(NSString *)namespaceURI
        qualifiedName:(NSString *)qName {
        
    //NSLog(@"</%@>", elementName);

    if (captureCharacters) {
        captureCharacters = NO;
        text = [NSString stringWithString:capturedCharacters];
        [capturedCharacters release];
    }

    if ([elementName isEqual:@"string"]) {
        [items addObject:text];
    }
}

int main()
{
    NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];

    NSString *xmlString = @"<?xml version=\"1.0\" encoding=\"utf-8\"?><ArrayOfString xmlns:xsi=\"http://w...content-available-to-author-only...3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://w...content-available-to-author-only...3.org/2001/XMLSchema\" xmlns=\"http://t...content-available-to-author-only...i.org/\"><string>Desert.jpg</string><string>Koala.jpg</string><string>Tulips.jpg</string></ArrayOfString>";

    NSData *xmlData = [xmlString dataUsingEncoding:NSUTF8StringEncoding];

    AOSParser *parser = [[AOSParser alloc] init];

    NSError *error = nil;
    NSMutableArray *items = [parser parseXMLData:xmlData parseError:&error];

    if (error) {
        NSLog(@"Error: %@", [error localizedDescription]);
    }
    
    NSLog(@"Items: %@", items);
    
    [parser release];
    [items release];
    
    [myPool drain];
    return 0;
}
@end
