Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parsing NSXMLNode Attributes in Cocoa

Given the following XML file:

    <?xml version="1.0" encoding="UTF-8"?>
<application name="foo">
 <movie name="tc" english="tce.swf" chinese="tcc.swf" a="1" b="10" c="20" />
 <movie name="tl" english="tle.swf" chinese="tlc.swf" d="30" e="40" f="50" />
</application>

How can I access the attributes ("english", "chinese", "name", "a", "b", etc.) and their associated values of the MOVIE nodes? I currently have in Cocoa the ability to traverse these nodes, but I'm at a loss at how I can access the data in the MOVIE NSXMLNodes.

Is there a way I can dump all of the values from each NSXMLNode into a Hashtable and retrieve values that way?

Am using NSXMLDocument and NSXMLNodes.

like image 277
Jeffrey Kern Avatar asked Jun 02 '10 22:06

Jeffrey Kern


1 Answers

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 valid
if (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.
                        }
                    }
            }   
   }
like image 132
Jeffrey Kern Avatar answered Sep 28 '22 19:09

Jeffrey Kern