2009-06-11 8 views
7

मैं इस XML को पार्स करने के लिए touchXML का उपयोग कैसे करूं? मैं सभी विशेषताओं को एक शब्दकोश में कुंजी/मूल्य जोड़े के रूप में स्टोर करना चाहता हूं।TouchXML पार्सिंग एक्सएमएल गुण

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

मेरे पास है कोई समस्या नहीं एक्सएमएल इसलिए का प्रारूप ऐसा है:

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

लेकिन मैं क्या जब विशेषताओं के साथ काम करने के लिए यकीन नहीं है ...

आप TouchXML के साथ विशेषताओं को कैसे प्राप्त कर सकते हैं? विशेष रूप से यदि किसी नोड में एक उपनोड होता है जिसमें गुण भी होते हैं ..

पहले उदाहरण XML फ़ाइल के अनुसार। पहले एक्सएमएल उदाहरण में मैंने प्लेयर विशेषताओं को प्राप्त करने में कामयाब रहे लेकिन बच्चे नोड्स 'राउंडस्कोर' विशेषताओं में नहीं।

एक मदद के लिए हाथ प्यार करोगे ..

धन्यवाद,

दान

उत्तर

0

मुझे पता चला आप बच्चे नोड्स CXElements हैं जाँच करने के लिए है। कभी-कभी वे CXMLNodes होते हैं और इनमें विशेषता गुण नहीं होते हैं।

+0

तो क्या आपके प्रश्न का उत्तर दिया गया है? यदि यह है तो कृपया इसे चिह्नित करें। – JoePasq

+0

क्या आप एक उदाहरण पोस्ट कर सकते हैं? एक्सएमएल टैग विशेषताओं को पार्स करने के बारे में मेरा एक ही प्रश्न है। – sniurkst

13

अधिक जानकारी के लिए visit this post। मैंने इसके बारे में पूरी जानकारी दी है।

हाँ! आपकी समस्या हल हो गई।

कोड के बाद देखें। उम्मीद है आप समझ गए होंगे। यह आपकी आवश्यकता के लिए काम कर रहा है। मैंने भी जोड़ा है - एनएसएलओजी - परिणाम - पार्स किया गया।

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

, धन्यवाद। यह वास्तव में मेरी मदद की। –

+0

@ स्पार्क। क्या nodeforXpath आवश्यक है? मैं कुछ डेटा सर्वर पर पोस्ट करना चाहता हूँ? मुझे सर्वर से डेटा मिल रहा है ठीक है, लेकिन मैं इसे सर्वर पर पोस्ट या अपडेट नहीं कर सकता। मेरे पास वेब सेवा है। –

1

टीबीएक्सएमएल का उपयोग करें, एक्सएमएल फाइलों के साथ काम करने पर यह बहुत आसान और तेज़ है। अच्छा दस्तावेज भी। गुणों के साथ आपकी समस्या यहां हल हो गई है। http://www.tbxml.co.uk/TBXML/TBXML_Free.html