2009-06-11 12 views
7

Come si utilizza touchXML per analizzare questo XML? Voglio memorizzare tutti gli attributi come coppie chiave/valore in un dizionario.TouchXML durante l'analisi degli attributi XML

<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> 

non ho alcun problema è il XML è formattato in questo modo:

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

Ma io non sono sicuro di cosa fare quando si tratta di attributi ...

Come si possono ottenere attributi con touchXML? In particolare se un nodo ha un sottonodo che ha anche attributi.

Come per il primo file XML di esempio. Nel primo esempio XML sono riuscito ad ottenere gli attributi Player ma non gli attributi 'RoundScore' dei nodi figli.

amerebbe una mano ..

Grazie,

Dan

risposta

0

ho scoperto che si controlla il bambino nodi sono CXElements. A volte sono CXMLNodes e questi non hanno proprietà di attributo.

+0

Così è la tua domanda risposta? Se è per favore segnalo così. – JoePasq

+0

puoi per favore pubblicare un esempio? Ho la stessa domanda sull'analisi degli attributi dei tag XML. – sniurkst

13

Per ulteriori informazioni visit this post. Ne ho dato un resoconto completo a riguardo.

Sì! risolto il tuo problema.

vedere, codice seguente. Spero che tu capisca. Sta funzionando per il tuo requisito. Ho anche aggiunto: NSLog - Result - analizzato.

-(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; 
      } 
     ); 
    } 
) 
+0

, grazie. mi ha davvero aiutato. –

+0

@Spark. NodeforXpath è necessario? Voglio postare alcuni dati sul server? Sto ricevendo dati dal server è ok, ma non posso postare o aggiornarlo al server. Ho un servizio web. –

Problemi correlati