Tutorial :TouchXML parsing XML attributes



Question:

How do I use touchXML to parse this XML? I want to store all the attributes as key/value pairs in a dictionary.

<Player PlayerName="Padraig HARRINGTON" CurrentPosition="1" CurrentRank="1"      Country="IRL" NumberOfHolesPlayed="18" ParRelativeScore="+3">      <RoundScore RoundNumber="1" Score="74" />      <RoundScore RoundNumber="2" Score="68" />      <RoundScore RoundNumber="3" Score="72" />      <RoundScore RoundNumber="4" Score="69" />  </Player>  <Player PlayerName="Ian POULTER" CurrentPosition="2" CurrentRank="2" Country="ENG"       NumberOfHolesPlayed="18" ParRelativeScore="+7">      <RoundScore RoundNumber="1" Score="72" />      <RoundScore RoundNumber="2" Score="71" />      <RoundScore RoundNumber="3" Score="75" />      <RoundScore RoundNumber="4" Score="69" />  </Player>  <Player PlayerName="Henrik STENSON" CurrentPosition="3" CurrentRank="T3"           Country="SWE"       NumberOfHolesPlayed="18" ParRelativeScore="+9">      <RoundScore RoundNumber="1" Score="76" />      <RoundScore RoundNumber="2" Score="72" />      <RoundScore RoundNumber="3" Score="70" />      <RoundScore RoundNumber="4" Score="71" />  </Player>  

I have no problem is the XML is formatted like so:

<Player>  <Country>UK</Country>  <NumberOfHolesPlayed>12</NumberOfHolesPlayed>  ...  ...  

But I'm not sure what to do when dealing with attributes...

How can you get attributes with touchXML? In particular if a node has a subnode that also has attributes..

As per the first example XML file. In the first XML example I managed to get the Player attributes but not the child nodes 'RoundScore' attributes.

Would love a helping hand..

Thanks,

Dan


Solution:1

For more information visit this post . I have given complete brief about it.

Yep ! solved your problem.

see, following code. Hope you understand. It's working for your requirement. I also have added - NSLog - Result - parsed.

-(void)methodForParsingPlayers{      NSMutableArray *ar=[[NSMutableArray alloc] init];      CXMLDocument *doc=[[[CXMLDocument alloc] initWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Players" ofType:@"xml"]] options:0 error:nil] autorelease];        NSArray *nodes=nil;      nodes=[doc nodesForXPath:@"//Player" error:nil];        NSString *strValue;      NSString *strName;        for (CXMLElement *node in nodes) {          NSMutableDictionary *object=[[NSMutableDictionary alloc] init];            // process to set attributes of object ----------------------------------------          NSMutableDictionary *objectAttributes=[[NSMutableDictionary alloc] init];          NSArray *arAttr=[node attributes];          NSUInteger i, countAttr = [arAttr count];          for (i = 0; i < countAttr; i++) {              strValue=[[arAttr objectAtIndex:i] stringValue];              strName=[[arAttr objectAtIndex:i] name];              if(strValue && strName){                  [objectAttributes setValue:strValue forKey:strName];              }          }          [object setValue:objectAttributes forKey:[node name]];          [objectAttributes release]; objectAttributes=nil;          // --------------------------------------------------------------------------------            // process to read elements of object ----------------------------------------          NSUInteger j, countElements = [node childCount];          CXMLNode *element;          NSMutableDictionary *elementDictionary=nil;          for (j=0; j<countElements; j++) {              element=[node childAtIndex:j];              elementDictionary=[[NSMutableDictionary alloc] init];                // process to read element attributes ----------------------------------              if([element isMemberOfClass:[CXMLElement class]]){                  CXMLElement *element2=(CXMLElement*)element;                  arAttr=[element2 attributes];                  countAttr=[arAttr count];                  for (i=0; i<countAttr; i++) {                      strName=[[arAttr objectAtIndex:i] name];                      strValue=[[arAttr objectAtIndex:i] stringValue];                      if(strName && strValue){                          [elementDictionary setValue:strValue forKey:strName];                      }                  }              }              // --------------------------------------------------------------------                // element value if available              strValue=[element stringValue];              if(strValue){                  [elementDictionary setValue:strValue forKey:@"value"];              }              // ---------------------------------------------------------------------                // check if object/dictionary exists for this key "name"              strName=[element name];              if([object valueForKey:strName]){                  if([[object valueForKey:strName] isKindOfClass:[NSMutableDictionary class]]){                      NSMutableDictionary *d=[[NSMutableDictionary alloc] initWithDictionary:[object valueForKey:strName]];                      NSMutableArray *arOFSameElementName=[[NSMutableArray alloc] initWithObjects:d,elementDictionary,nil];                      [object setValue:arOFSameElementName forKey:strName];                      [d release]; d=nil;                      [arOFSameElementName release]; arOFSameElementName=nil;                  } else {                      NSMutableArray *arOFSameElementName=[object valueForKey:strName];                      [arOFSameElementName addObject:elementDictionary];                  }              } else {                  [object setValue:elementDictionary forKey:strName];              }              [elementDictionary release]; elementDictionary=nil;              // ---------------------------------------------------------------------          }          [ar addObject:object];          [object release]; object=nil;          // --------------------------------------------------------------------------------      }      NSLog(@"%@",[ar description]);  }      2010-08-13 12:45:48.786 TouchTry[2850:207] (          {          Player =         {              Country = IRL;              CurrentPosition = 1;              CurrentRank = 1;              NumberOfHolesPlayed = 18;              ParRelativeScore = "+3";              PlayerName = "Padraig HARRINGTON";          };          RoundScore =         (                          {                  RoundNumber = 1;                  Score = 74;              },                          {                  RoundNumber = 2;                  Score = 68;              },                          {                  RoundNumber = 3;                  Score = 72;              },                          {                  RoundNumber = 4;                  Score = 69;              }          );      },          {          Player =         {              Country = ENG;              CurrentPosition = 2;              CurrentRank = 2;              NumberOfHolesPlayed = 18;              ParRelativeScore = "+7";              PlayerName = "Ian POULTER";          };          RoundScore =         (                          {                  RoundNumber = 1;                  Score = 72;              },                          {                  RoundNumber = 2;                  Score = 71;              },                          {                  RoundNumber = 3;                  Score = 75;              },                          {                  RoundNumber = 4;                  Score = 69;              }          );      },          {          Player =         {              Country = SWE;              CurrentPosition = 3;              CurrentRank = T3;              NumberOfHolesPlayed = 18;              ParRelativeScore = "+9";              PlayerName = "Henrik STENSON";          };          RoundScore =         (                          {                  RoundNumber = 1;                  Score = 76;              },                          {                  RoundNumber = 2;                  Score = 72;              },                          {                  RoundNumber = 3;                  Score = 70;              },                          {                  RoundNumber = 4;                  Score = 71;              }          );      }  )  


Solution:2

Use TBXML, its much easier and faster on working with XML files. Nice documentation also. Your problem with Attributes is easier solved here. http://www.tbxml.co.uk/TBXML/TBXML_Free.html


Solution:3

I found out that you have to check the child nodes are CXElements. Sometimes they're CXMLNodes and these don't have attribute properties.


Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »