كيف تضيف قيمة افتراضية إلى صفيف عندما لم يتم العثور على عنصر الطفل في تحليل XML؟

StackOverflow https://stackoverflow.com/questions/2229189

سؤال

أنا جديد في تطوير iPhone. أنا أقنع صفحة XML وعرض المحتوى في جدول طاولات. في بعض الكتلة في صفحة XML، فقد مفقود عنصر الطفل، أريد إضافة قيمة س في صفيف، عند عنصر الطفل ليس مولعا في كتلة XML الخاصة بالكتلة المعينة

 <entry>
 <id>xxx </id>
 <title>xxxxx</title>
 <gd:ratings numRaters="2"/>
 </entry> ..................................>first block
 <entry>
 <id>xxx </id>
 <title>xxxxx</title>
 </entry> ....................................>Second block
 <entry>
 <id>xxx </id>
 <title>xxxxx</title>
 <gd:ratings numRaters="2"/>
 </entry> .....................................>Third block

أنا أقنع علامة GD: علامة التصنيف وعرض قيمة السمة الخاصة بها في جدول الطاولة. أحصل على مجموعة قابلة للتغيير مما يؤدي إلى تخزين قيمة numrates.i تضطر إلى إضافة كائن "O" في الصفيف عندما يتم تحليل الكتلة الثانية لأنها لا تحتوي على GD: التصنيفات علامة التقييم. استرجاع المحتوى وإضافةه إلى صفيف قابل للتغيير يتم في طريقة محلل NSXML DidStarteLement.

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{            

currentElement = [elementName copy];
if ([elementName isEqualToString:@"entry"]) {

    entry = [[NSMutableDictionary alloc] init];
    currentTitle = [[NSMutableString alloc] init];
    currentDate = [[NSMutableString alloc] init];
    NSLog(@"inside image1 ");
}else if([elementName isEqualToString:@"media:thumbnail"])
    { currentImage = [[NSMutableString alloc] init];
        if(myUrl == nil){   
        myUrl = [NSString stringWithString:[attributeDict objectForKey:@"url"]];
        }
        [currentImage appendString:myUrl];  
        [stories1 addObject:currentImage];
        myUrl=nil;
        }   else if([elementName isEqualToString:@"gd:rating"])
{
    currentRating=[[NSMutableString alloc]init];

        myRatings=[NSString stringWithString:[attributeDict objectForKey:@"numRaters"]];

    [currentRating appendString:myRatings];
    [stories2 addObject:currentRating];
}   
}

نظرا لوجود 25 قطعة من علامات الدخول، وفي حدة 10 كتلة لا تحتوي على عنصر تصنيف GD .So تحتوي مجموعة صفيف على صفيف فقط 15 قيما. لذلك لا يمكنني عرضه في الجدول الافتراضي بالترتيب. هل هناك أي طريقة لاسترداد علامة السمة في طريقة "وجدت الشخصيات". الرجاء مساعدتي في الخارج.

هل كانت مفيدة؟

المحلول

يمكنك استعمال ال didEndElement الطريقة: عند انتهاء العنصر الخارجي، تحقق مما إذا تمت إضافة عنصر الطفل إلى الصفيف.

يمكنك استخدام Ivar BOOL entryHasRating وتفعل ما يلي:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{            

   currentElement = [elementName copy];
   if ([elementName isEqualToString:@"entry"]) {
     entryHasRating = NO;
     ...
   } else if ([elementName isEqualToString:@"gd:rating"]){
     entryHasRating = YES;
     ...
   }
}

ثم عندما ينتهي عنصر:

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
   if ([elementName isEqualToString:@"entry"]&& !entryHasRating) {
       [stories2 addObject:@"No Rating"];
       entryHasRating = YES; 
   }
   ...
}

نصائح أخرى

إذا كنت تعرف كل مجال الحقول التي ستتوقعها، فيمكنك إنشاء قاموس مع العناصر النائبة لجميع قيمك المتوقعة قبل تحليل XML؛ كما تحليل XML فقط استبدل العناصر النائبة بقيم حقيقية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top