2012-01-25 3 views
1

Я пытаюсь разобрать некоторый XML для приложения iphone (IOS5 xcode4.2). Я отказался от NSXMLParser, поскольку это было болью в любом месте. Поэтому я пошел с touchXML, я могу вытащить удаленный файл XML с веб-сервера и увидеть имена узлов, но значения этих узлов пустые. См. Код ниже и образец xml (я взял много данных). Но что я я пытаюсь сделать, это получить NSArray или NSDirectory с именем персонажа и подмассива или NSDirectory все статистики они ключом являются именем стата и значения как значениеTouchXML Пустые значения узла

<apiresponse> 
    <character name="testname" ....> 
    <vocation name="testvocation" ....>...</vocation> 
    <stats> 
    <stat name="health" value="1234"/> 
    <stat name="power" value="4321"/> 
    </stats> 
    <equipment> 
    </equipment> 
    </character> 

// Create a new xmlParser object based on the TouchXML "CXMLDocument" class, this is the 
// object that actually grabs and processes the xml data 
CXMLDocument *xmlParser = [[CXMLDocument alloc] initWithContentsOfURL:url options:0 error:nil]; 

// Create a new Array object to be used with the looping of the results from the xmlParser 
NSArray *resultNodes = NULL; 



// Set the resultNodes Array to contain an object for every instance of an node in our xml 
resultNodes = [xmlParser nodesForXPath:@"apiresponse/character" error:nil]; 



// Loop through the resultNodes to access each items actual data 
    for (CXMLElement *resultElement in resultNodes) { 

     // Create a temporary MutableDictionary to store the items fields in, which will eventually end up in stats 
     NSMutableDictionary *stat = [[NSMutableDictionary alloc] init]; 

     // Create a counter variable as type "int" 
     int counter; 

     // Loop through the children of the current node 
     for(counter = 0; counter < [resultElement childCount]; counter++) { 

      // Add each field to the stat Dictionary with the node name as key and node value as the value 
      [stat setObject:[[resultElement childAtIndex:counter] stringValue] forKey: [[resultElement childAtIndex:counter] name]]; 
     } 

     // Add the stat to the global stats Array so that the view can access it. 
     [self.stats addObject:[stat copy]]; 
    } 
} 

NSLog

2012-01-25 08:27:08.890 test[12815:f803] (
    { 
    equipment = ""; 
    stats = ""; 
    vocation = ""; 
} 
) 
+0

Вы говорите, что вы заботитесь только о 'stats' разделе? Тебя не интересуют оборудование или призвание? Также в примере '' is '" testname "' имя символа? – NJones

+0

да, я обожаю его, оборудование и призвание и да testname - это имя персонажа – GerritVK

ответ

0

Чтобы извлечь информацию из узла, вам необходимо использовать - (CXMLNode *)attributeForName:(NSString *)name. Я изменил код, чтобы распечатать всю информацию о желаемом узла:

// Set the xml URL appropriately 
NSURL *url = [NSURL URLWithString:@"file:///tmp/tmp.xml"]; 

// Create a new xmlParser object based on the TouchXML "CXMLDocument" class, this is the 
// object that actually grabs and processes the xml data 
CXMLDocument *xmlParser = [[CXMLDocument alloc] initWithContentsOfURL:url options:0 error:nil]; 

// Create a new Array object to be used with the looping of the results from the xmlParser 
NSArray *resultNodes = NULL; 

// Set the resultNodes Array to contain an object for every instance of an node in our xml 
resultNodes = [xmlParser nodesForXPath:@"apiresponse/character" error:nil]; 

// Loop through the resultNodes to access each items actual data 
for (CXMLElement *resultElement in resultNodes) 
{ 
    // Print out the initial character 'name' attribute 
    NSLog(@"Name: %@, Attribute: %@", [resultElement localName], [[resultElement attributeForName:@"name"] stringValue]); 

    // Loop through the children of the current node 
    for(int counter = 0; counter < [resultElement childCount]; counter++) 
    { 
     NSArray *children = [resultElement elementsForName:[[resultElement childAtIndex:counter] localName]]; 
     for(int secondcounter = 0; secondcounter < [children count]; secondcounter++) 
     { 
      CXMLElement *child = [children objectAtIndex:secondcounter]; 
      // Print out the subsequent layer's 'name' attributes 
      NSLog(@"Name: %@, Attribute: %@", [child localName], [[child attributeForName:@"name"] stringValue]); 

      // Special case for stats which have more children nodes 
      if([[child localName] isEqualToString:@"stats"]) 
      { 
       NSArray *grandchildren = [child elementsForName:@"stat"]; 

       for(int thirdcounter = 0; thirdcounter < [grandchildren count]; thirdcounter++) 
       { 
        CXMLElement *grandchild = [grandchildren objectAtIndex:thirdcounter]; 
        // Get all of the stats name's 
        NSLog(@"Name: %@, Attribute: %@", [grandchild localName], [[grandchild attributeForName:@"name"] stringValue]); 
       } 
      } 
     } 
    } 
} 

От NSLog:

2013-12-03 16:51:20.170 Validator[6520:707] Name: character, Attribute: testname 
2013-12-03 16:51:20.171 Validator[6520:707] Name: vocation, Attribute: testvocation 
2013-12-03 16:51:20.171 Validator[6520:707] Name: stats, Attribute: (null) 
2013-12-03 16:51:20.171 Validator[6520:707] Name: stat, Attribute: health 
2013-12-03 16:51:20.171 Validator[6520:707] Name: stat, Attribute: power 
2013-12-03 16:51:20.172 Validator[6520:707] Name: equipment, Attribute: (null) 
Смежные вопросы