Parsing NSXMLNode Attributes in Cocoa Parsing NSXMLNode Attributes in Cocoa xml xml

Parsing NSXMLNode Attributes in Cocoa


YES! I answered my own question somehow.

When iterating through the XML document, instead of assigning each child node as an NSXMLNode, assign it as an NSXMLElement. You can then use the attributeForName function, which returns an NSXMLNode, to which you can use stringValue on to get the attribute's value.

Since I'm bad at explaining things, here's my commented code. It might make more sense.

//make sure that the XML doc is validif (xmlDoc != nil) {            //get all of the children from the root node into an array            NSArray *children = [[xmlDoc rootElement] children];            int i, count = [children count];            //loop through each child            for (i=0; i < count; i++) {                NSXMLElement *child = [children objectAtIndex:i];                    //check to see if the child node is of 'movie' type                    if ([child.name isEqual:@"movie"]) {                    {                        NSXMLNode *movieName = [child attributeForName:@"name"];                        NSString *movieValue = [movieName stringValue];                        //verify that the value of 'name' attribute of the node equals the value we're looking for, which is 'tc'                        if ([movieValue isEqual:@"tc"]) {                        //do stuff here if name's value for the movie tag is tc.                        }                    }            }      }


There are two options. If you continue to use NSXMLDocment and you have an NSXMLNode * for the a movie element, you can do this:

if ([movieNode kind] == NSXMLElementKind){    NSXMLElement *movieElement = (NSXMLElement *) movieNode;    NSArray *attributes = [movieElement attributes];    for (NSXMLNode *attribute in attributes)    {        NSLog (@"%@ = %@", [attribute name], [attribute stringValue]);    }}

Otherwise, you can switch to using an NSXMLParser instead. This is an event driven parser that informs a delegate when it has parsed elements (among other things). The method you're after is parser:didStartElement:namespaceURI:qualifiedName:attributes:

- (void) loadXMLFile{    NSXMLParser *parser = [NSXMLParser parserWithContentsOfURL:@"file:///Users/jkem/test.xml"];    [parser setDelegate:self];    [parser parse];}// ... later ...-      (void)         parser:(NSXMLParser *)parser             didStartElement:(NSString *)elementName                namespaceURI:(NSString *)namespaceURI               qualifiedName:(NSString *)qualifiedName                  attributes:(NSDictionary *)attributeDict{    if ([elementName isEqualToString:@"movie"])    {        NSLog (@"%@", [attributeDict objectForKey:@"a"]);        NSLog (@"%d", [[attributeDict objectForKey:@"b"] intValue]);    }}