2010-06-02 10 views
11

को देखते हुए निम्नलिखित एक्सएमएल फ़ाइल में गुण:पार्सिंग NSXMLNode कोको

<?xml version="1.0" encoding="UTF-8"?> 
<application name="foo"> 
<movie name="tc" english="tce.swf" chinese="tcc.swf" a="1" b="10" c="20" /> 
<movie name="tl" english="tle.swf" chinese="tlc.swf" d="30" e="40" f="50" /> 
</application> 

मैं विशेषताओं ("अंग्रेज़ी", "चीनी", "नाम", "एक" कैसे उपयोग कर सकते हैं, "बी", आदि) और मूवी नोड्स के उनके संबंधित मूल्य? मेरे पास वर्तमान में कोको में इन नोड्स को पार करने की क्षमता है, लेकिन मुझे लगता है कि मैं MOVIE NSXMLNodes में डेटा तक कैसे पहुंच सकता हूं।

वहाँ एक रास्ता मैं एक Hashtable में प्रत्येक NSXMLNode से मूल्यों के सभी डंप और इस तरह से मूल्यों को पुनः प्राप्त कर सकते हैं?

NSXMLDocument और NSXMLNodes का उपयोग कर रहा हूँ।

उत्तर

12

हाँ! मैंने किसी भी तरह से अपने सवाल का जवाब दिया।

जब XML दस्तावेज के माध्यम से पुनरावृत्ति के बजाय एक NSXMLNode के रूप में प्रत्येक बच्चे के नोड बताए, एक NSXMLElement में निर्दिष्ट करें। इसके बाद आप विशेषता ForName फ़ंक्शन का उपयोग कर सकते हैं, जो एक NSXMLNode देता है, जिसमें आप विशेषता के मान प्राप्त करने के लिए स्ट्रिंगवैल्यू का उपयोग कर सकते हैं।

के बाद से मैं चीजों को स्पष्ट करने बुरा हूँ, यहाँ मेरी टिप्पणी की कोड है। यह और अधिक समझ सकता है।

//make sure that the XML doc is valid 
if (xmlDoc != nil) { 
      //get all of the children from the root node into an array 
      NSArray *children = [[xmlDoc rootElement] children]; 
      int i, count = [children count]; 

      //loop through each child 
      for (i=0; i < count; i++) { 
       NSXMLElement *child = [children objectAtIndex:i]; 

        //check to see if the child node is of 'movie' type 
        if ([child.name isEqual:@"movie"]) { 
        { 
         NSXMLNode *movieName = [child attributeForName:@"name"]; 
         NSString *movieValue = [movieName stringValue]; 

         //verify that the value of 'name' attribute of the node equals the value we're looking for, which is 'tc' 
         if ([movieValue isEqual:@"tc"]) { 
         //do stuff here if name's value for the movie tag is tc. 
         } 
        } 
      } 
    } 
+0

आप [xmldoc nodesForXPath: @ "/ एप्लिकेशन/मूवी [@ name = 'tc']" त्रुटि: त्रुटि] का उपयोग करने वाले नोड्स पर भी ड्रिल कर सकते हैं आप मूल्यांकन के लिए नए संदर्भ नोड के रूप में लौटा नोड्स का उपयोग कर सकते हैं आगे XPath अभिव्यक्तियां। –

+0

धन्यवाद। मुझे यकीन नहीं था कि XPath क्वेरी कैसे काम करती है, लेकिन मेरे एक्सएमएल फ़ाइल के साथ दिए गए आपके उदाहरण के साथ मैं देख सकता हूं कि बुनियादी प्रश्न कैसे काम करते हैं। इंटरनेट पर एक्सकोड पर पढ़ना, मैं उदाहरणों से उलझन में था क्योंकि मुझे इनका उपयोग करने के संदर्भ में यकीन नहीं था। –

9

दो विकल्प हैं। आप NSXMLDocment का उपयोग जारी है और आप एक फिल्म तत्व के लिए एक NSXMLNode * है, तो आप ऐसा कर सकते हैं:

if ([movieNode kind] == NSXMLElementKind) 
{ 
    NSXMLElement *movieElement = (NSXMLElement *) movieNode; 
    NSArray *attributes = [movieElement attributes]; 

    for (NSXMLNode *attribute in attributes) 
    { 
     NSLog (@"%@ = %@", [attribute name], [attribute stringValue]); 
    } 
} 

अन्यथा, आप के बजाय एक NSXMLParser उपयोग भी कर सकते हैं। यह एक घटना संचालित पार्सर है जो एक प्रतिनिधि को सूचित करता है जब उसने तत्वों को पार्स किया है (अन्य चीजों के साथ)। जिस विधि के बाद आप हैं parser:didStartElement:namespaceURI:qualifiedName:attributes:

- (void) loadXMLFile 
{ 
    NSXMLParser *parser = [NSXMLParser parserWithContentsOfURL:@"file:///Users/jkem/test.xml"]; 
    [parser setDelegate:self]; 
    [parser parse]; 
} 


// ... later ... 

-  (void)   parser:(NSXMLParser *)parser 
      didStartElement:(NSString *)elementName 
       namespaceURI:(NSString *)namespaceURI 
       qualifiedName:(NSString *)qualifiedName 
        attributes:(NSDictionary *)attributeDict 
{ 
    if ([elementName isEqualToString:@"movie"]) 
    { 
     NSLog (@"%@", [attributeDict objectForKey:@"a"]); 
     NSLog (@"%d", [[attributeDict objectForKey:@"b"] intValue]); 
    } 
} 
+0

आप dreamlax धन्यवाद! मुझे इस समस्या का अपना समाधान भी मिला, जिसे मैंने भी पोस्ट किया था। लेकिन मैं इसे स्वीकार कर रहा हूं क्योंकि आपने इसे हल करने के लिए समय और ऊर्जा भी ली है। धन्यवाद, और मैं आपके कोड को संदर्भ के रूप में भी उपयोग करने की आशा करता हूं। –

+0

@Jeffrey सर्द: यह सब के बाद अपने दम पर बातें हल करने के लिए, अच्छा है, मैं एक गलती मेरा उत्तर में था;) – dreamlax

+0

हे, मुझे लगता है कि अपने समाधान एक लील थोड़ा और अधिक मेरा की तुलना में सुरुचिपूर्ण है। :) –