سؤال

لدي طريقة تقوم بقراءة ملف XML وتخزن العقد XML في مسار XPath معين في NSAray يسمى * العقد. ما أريد القيام به هو تناول كل واحد من العناصر الموجودة في الصفيف وإضافتها إلى كيان بيانات أساسي يسمى الفئة مع سمة "الاسم".

لقد جربت عددا من الطرق المختلفة لإنشاء الكيان، لكنني لست متأكدا من الطريقة الصحيحة للقيام بذلك بشكل فعال. هذا هو الرمز المستخدم لإنشاء NSArray، أي أفكار حول كيفية تنفيذ هذا؟ (تجاهل NSError، سأصلح هذا في الإصدار النهائي)

- (IBAction)readCategories:(id)sender

{

NSString *xmlString = [resultView string];

NSData *xmlData = [xmlString dataUsingEncoding: NSASCIIStringEncoding];

NSXMLDocument *xmlDoc = [[NSXMLDocument alloc] initWithData:xmlData options:nil error:nil];

//XPath

NSError *err=nil;

NSArray *nodes = [xmlDoc nodesForXPath:@"//member[name='description']/value/string" error:&err];

}

تحرير - رمز حلقة بلدي

NSArray *nodes = [xmlDoc nodesForXPath:@"//member[name='description']/value/string" error:&err];
int arrayCount = [nodes count];
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSXMLElement *categoryEl;
NSString *new = [catArrayController newObject];
int i;
for (i = 0; i < arrayCount; i++)
{
    [categoryEl = [nodes objectAtIndex:i]];
    [new setValue:[categoryEl stringValue] forKey:@"name"];
    [catArrayController addObject:new];
}
[pool release];
هل كانت مفيدة؟

المحلول

إليك كيف أكتبها:

for (NSXMLElement *categoryElement in nodes) {
    NSManagedObject *newObject = [catArrayController newObject];
    [newObject setValue:[categoryElement stringValue] forKey:@"name"];
    [catArrayController addObject:newObject];
    [newObject release];
}

أولا، أنا أستخدم الهدف-C 2.0 لكل جملة لكل بناء جملة. هذا أبسط من استخدام متغيرات الفهرس. أنا القضاء على i و arrayCount.

بعد ذلك، أخرجت NSAutoreleasePool. وبعد لا شيء من الكائنات الموجودة في الحلقة autoreased، لذلك لم يكن لها أي تأثير. (ال newObject تتم إرجاع الأسلوب كائنا محتجزا وهو، حسب الاتفاقية، ما هي الأساليب مع الكلمة new في اسمهم) هذا هو أيضا لماذا أصدر newObject بعد إضافته إلى وحدة تحكم الصفيف. نظرا لأنني لن أستخدمه في هذه الطريقة، أحتاج إلى إطلاق سراحه.

أيضا، كنت قد حددت new (الذي قمت بإعادة تسميته newObject) كما NSString. وبعد كائنات البيانات الأساسية هي دائما إما مثيل NSManagedObject أو فرعية من NSManagedObject.

خطك [categoryEl = [nodes objectAtIndex:i]] لن تجميع. ذلك لأن بناء جملة قوس يستخدم لإرسال رسالة إلى كائن. هذا عبارة مهمة، لذلك ليس هناك حاجة إلى بناء جملة القوس هنا. (هذا الخط ليس ضروريا أيضا بسبب تغيير الحلقة لاستخدام بناء جملة لكل لكل) ولكن، للرجوع إليه في المستقبل، categoryEl = [nodes objectAtIndex:i]; كان قد عملت.

نصائح أخرى

أي جزء تواجه مشكلة مع؟ لا ينبغي أن يكون هناك الكثير مقابل الحلقات من خلال الصفيف، وإنشاء كائن مدار جديد لكل إدخال، ووضع السمات الصحيحة. يمكنك إنشاء الكائن المدار مع NSentityDescription -insertNewObjectForEntityForName:inManagedObjectContext: طريقة.

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