2009-06-11 29 views
7

Bu XML'i ayrıştırmak için touchXML'i nasıl kullanırım? Tüm öznitelikleri sözlükteki anahtar/değer çiftleri olarak kaydetmek istiyorum. ...TouchXML XML öznitelikleri ayrıştırma

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

Ama nitelikler ile uğraşırken ne yapacağını emin değilim:

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

Ben hiçbir sorun XML biçimlendirilir şöyle olduğunu

TouchXML ile nasıl nitelikler edinebilirsiniz? Özellikle, bir düğümün, aynı zamanda özniteliklere sahip olan bir altnota sahip olması durumunda ..

İlk örnek XML dosyasına göre. İlk XML örneğinde Oyuncu özelliklerini almayı başardım, ancak 'RoundScore' özelliklerinin çocuk düğümlerini almayı başardım.

Sana düğümleri CXElements olan çocuğu kontrol etmek zorunda olduğunu öğrendim

Dan

cevap

0

sayesinde .. yardım eli isterim. Bazen CXMLNode'larıdır ve bunların özellik özellikleri yoktur.

+0

Sorunuz yanıtlandı mı? Eğer varsa lütfen belirtiniz. – JoePasq

+0

Bir örnek gönderir misiniz? XML etiket özniteliklerini ayrıştırma konusunda da aynı sorum var. – sniurkst

13

Daha fazla bilgi için visit this post. Bu konuda tam bir özet verdim.

Evet! sorununu çözdüm.

, aşağıdaki kodlara bakın. Umarım anlarsın. İhtiyaçlarınız için çalışıyor. Ayrıca ekledim - NSLog - Sonuç - ayrıştırıldı.

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

, Teşekkürler. gerçekten bana yardımcı oldu. –

+0

@Spark. NodeforXpath gerekli midir? Sunucuya bazı veriler göndermek istiyorum? Sunucudan veri alıyorum tamam, ancak sunucuya gönderemiyorum veya güncelleyemiyorum. Web servisim var. –