2012-07-15 27 views
5

पार्सिंग मैं वेबसाइट librarything.com से एक XML फ़ाइल (NSXMLParser का उपयोग करके) को पार्स करने का प्रयास कर रहा हूं। यह पहली फ़ाइल है जिसे मैंने कभी पार्स किया है, लेकिन अधिकांश भाग के लिए यह काफी सीधे आगे लगता है। सीडीएटीए ब्लॉक को पार्स करने का प्रयास करते समय मेरी समस्या होती है; विधि पार्सर: मिली सीडीएटीए: नहीं कहा जाता है, और मैं समझ नहीं पा रहा हूं क्यों। मुझे पता है कि मेरा पार्सर ठीक तरह से स्थापित है क्योंकि पार्सर: पाया गया कार्यकर्ता: विधि ठीक काम करती है। एक्सएमएल डेटा जो मैं पार्स करने की कोशिश कर रहा हूं, इस http://www.librarything.com/services/rest/1.1/?method=librarything.ck.getwork&isbn=030788743X&apikey=d231aa37c9b4f5d304a60a3d0ad1dad4 जैसा दिखता है और सीडीएटीए ब्लॉक विशेषता नाम "विवरण" के साथ तत्व के अंदर होता है।एक्सएमएल सीडीएटीए ब्लॉक

विधि को क्यों नहीं कहा जा रहा है, इस बारे में कोई मदद की सराहना की जाएगी!

संपादित करें: मैंने पार्सर चलाया: पाया गया कैरेक्टर: विवरण सीडीएटीए ब्लॉक पर विधि और यह "<" लौटा दी। मुझे लगता है कि इसका मतलब यह है कि पार्सर सीडीएटीए टैग को सही ढंग से नहीं देख रहा है। क्या यह ठीक करने के लिए मेरे अंत में कुछ भी किया जा सकता है?

उत्तर

2

ऐसा लगता है कि <fact> टैग में सीडीएटीए सामग्री parser:foundCharacters में एकाधिक कॉल बैक पर वृद्धिशील रूप से वापस की जा रही है। आप कक्षा में जहां NSXMLParserDelegate के अनुरूप रहे हैं, एक NSMutableString उदाहरण के लिए यह जोड़कर CDATA के निर्माण की कोशिश तो की तरह:

(नोट: यहाँ _currentElement एक NSString संपत्ति है और _factString एक NSMutableString संपत्ति है)

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {  
    self.currentElement = elementName; 
    if ([_currentElement isEqualToString:@"fact"]) { 
     // Make a new mutable string to store the fact string 
     self.factString = [NSMutableString string]; 
    } 

} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    if ([elementName isEqualToString:@"fact"]) { 
     // If fact string starts with CDATA tags then just get the CDATA without the tags 
     NSString *prefix = @"<![CDATA["; 
     if ([_factString hasPrefix:prefix]) { 
      NSString *cdataString = [_factString substringWithRange:NSMakeRange((prefix.length+1), _factString.length - 3 -(prefix.length+1))]; 
      // Do stuff with CDATA here... 
      NSLog(@"%@", cdataString); 
      // No longer need the fact string so make a new one ready for next XML CDATA 
      self.factString = [NSMutableString string]; 

     } 
    } 

} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if ([_currentElement isEqualToString:@"fact"]) { 
     // If we are at a fact element, append the string 
     // CDATA is returned to this method in more than one go, so build the string up over time 
     [_factString appendString:string]; 
    } 

}