0

XML ドキュメントをプロジェクトに解析する際に問題があります。次のエラーが表示されます。

キャッチされない例外 'NSUnknownKeyException' が原因でアプリを終了しています。理由: '[ setValue:forUndefinedKey:]: このクラスは、キー モーフのキー値コーディングに準拠していません。

これが私の XML ドキュメントのスニペットです。

<?xml version="1.0" encoding="utf-8"?>
<CAS version="2.1" avatar="anna">
  <frames count="111" signCount="3">

<signStart index="0" gloss="mug" />

<frame index="0" isComplete="true" time="0" duration="20" boneCount="74"
    morphCount="51">
  <morph name="aaa" amount="0" />
  <morph name="ooo" amount="0" />
  <morph name="pout" amount="0" />
  <morph name="eee" amount="0" />
  <morph name="cgng" amount="0" />

XMLParser.h ファイルのコードは次のとおりです。

#import <Foundation/Foundation.h>

@class User;

@interface XMLParser : NSObject {
// an ad hoc string to hold element value
NSMutableString *currentElementValue;
// user object
User *user;
// array of user objects
NSMutableArray *times;
NSMutableArray *durations;
NSMutableArray *wheres;
}

@property (nonatomic, retain) User *user;
@property (nonatomic, retain) NSMutableArray *times;
@property (nonatomic, retain) NSMutableArray *durations;
@property (nonatomic, retain) NSMutableArray *wheres;

- (XMLParser *) initXMLParser;

@end

および XMLParser.m

#import "XMLParser.h"
#import "User.h"

@implementation XMLParser
@synthesize user, times, durations, wheres;

- (XMLParser *) initXMLParser {
self = [super init];

if(self){
    // init array of user objects
    times       = [[NSMutableArray alloc] init];
    durations   = [[NSMutableArray alloc] init];
//  wheres = [[NSMutableArray alloc] init];
}

return self;
}

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

if(![elementName isEqual:@"frame"])
    return;
    NSLog(@"user element found – create a new instance of User class...");
    user = [[User alloc] init];

    //We do not have any attributes in the user elements, but if
    // you do, you can extract them here:
    NSString *time  = [attributeDict objectForKey:@"time"];
    NSString *duration = [attributeDict objectForKey:@"duration"];
    //NSString *where = [attributeDict objectForKey:@"where"];

    [times  addObject:time];
    [durations addObject:duration];
//      [wheres addObject:where];
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (!currentElementValue) {
    // init the ad hoc string with the value
    currentElementValue = [[NSMutableString alloc] initWithString:string];
} else {
    // append value to the ad hoc string
    [currentElementValue appendString:string];
}
NSLog(@"Processing value for : %@", string);
}  

- (void)parser:(NSXMLParser *)parser
 didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName {

if ([elementName isEqualToString:@"CAS"]) {
    // We reached the end of the XML document
    NSLog(@"names array: %@", times);
    NSLog(@"prices array: %@", durations);
//        NSLog(@"wheres array: %@", wheres);

    return;
}

if ([elementName isEqualToString:@"frame"]) {
    // We are done with user entry – add the parsed user
    // object to our user array
    //[users addObject:user];
    //user = nil;
} else {
    // The parser hit one of the element values.
    // This syntax is possible because User object
    // property names match the XML user element names
    [user setValue:currentElementValue forKey:elementName];
}    
currentElementValue = nil;
}

私のxmlファイルと関係があると思いますが、正確な問題について100%ではありません。

どんな助けでも大歓迎です。

乾杯、サム

4

3 に答える 3

0

あなたのユーザー クラスはキー「モーフ」の KVO を実装していますか?

User クラスを KVC と見なすために必要なもの

User クラスのインターフェースと実装を投稿できますか? それは便利でしょう。

KVO の実装の詳細

于 2013-01-29T02:23:55.673 に答える
0

あなたの User オブジェクトには実際には「モーフ」と呼ばれるプロパティがないように見えます。スペルが正しいことを再確認してください。実行時に実際に正しいクラスです。

于 2013-01-29T02:23:38.957 に答える
0

この問題は、次のコード行が原因であることがわかりました。

[user setValue:currentElementValue forKey:elementName];

プログラムが例外をスローする理由を理解するまで、コードから一時的に削除しました

于 2013-01-29T12:06:05.703 に答える