编写XMLDocument的问题

时间:2014-01-30 19:31:24

标签: objective-c xml

我有一个非基于文档的应用程序,表视图有两列,其Value绑定绑定到数组控制器的arrangeObjects的两个属性。我的AppDelegate中有一个NSMutableArray来保存数据,以及相应的@property和@synthesize。我实现了键值编码访问器方法,并在将数据插入数组时使用它们以生成KVO通知。我用xml文件中的一些NSDictionary对象填充我的数组。我已经完成了所有工作(修改,删除和添加项目),但我想做的是将其写回xml文件。

xmlData writeToFile:fileName atomically:YES

正在写入磁盘,但在编辑表视图时不反映更改。必须有一些我忘记的小事。它是什么? 任何建议都会很好!

代码:

//  AppDelegate.h

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>{
    NSXMLDocument *xmlDoc;
    NSXMLElement *root;
    NSMutableArray *children;
}

@property (assign) IBOutlet NSWindow *window;
@property (nonatomic, copy)NSArray *children;

- (void)setChildren:(NSArray *)newChildren;
- (NSUInteger)countOfChildren;
- (id)objectInChildrenAtIndex:(NSUInteger)index;
- (void)insertObject:(id)object inChildrenAtIndex:(NSUInteger)index;
- (void)removeObjectFromChildrenAtIndex:(NSUInteger)index;

- (IBAction)addObject:(id)sender;
- (IBAction)saveXMLToFile:(id)sender;
- (void) populateTable;
@end

//  AppDelegate.m

#import "AppDelegate.h"

@implementation AppDelegate

-(void) addObjectToChildren:(id)object{
    [self insertObject:object inChildrenAtIndex:[self countOfChildren]];
}
@synthesize children;

- (id)init{
    self = [super init];
    if (self) {
        children = [[NSMutableArray alloc] init];
    }
    return self;
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{    
    [self populateTable];
}

#pragma mark - Indexed Accessors
- (void)setChildren:(NSArray *)newChildren{
    if (children!=newChildren) {
        children=[newChildren mutableCopy];
    }
}

-(NSUInteger)countOfChildren{
    return [self.children count];
}

-(id)objectInChildrenAtIndex:(NSUInteger)index{
    return [self.children objectAtIndex:index];
}

- (void)insertObject:(id)object inChildrenAtIndex:(NSUInteger)index{
    [children insertObject:object atIndex:index];
}

-(void)removeObjectFromChildrenAtIndex:(NSUInteger)index{
    [children removeObjectAtIndex:index];
}

#pragma mark -
-(void)populateTable{
    NSError *error=nil;
    NSString *pathname = [@"~/myFile.xml" stringByExpandingTildeInPath];
    NSURL *url = [NSURL fileURLWithPath:pathname];

    xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:url options:NSXMLDocumentTidyXML error:&error];
    root = [xmlDoc rootElement];

    NSArray *array=[root nodesForXPath:@"number" error:&error];

    NSMutableArray *mArray=[[NSMutableArray alloc]init];

    for (NSXMLElement *element in array) {
        NSMutableDictionary *dict=[NSMutableDictionary dictionaryWithObjectsAndKeys:[element stringValue],@"id",@"number", @"name", nil];
        [mArray addObject:dict];
    }
    [self setChildren:[NSArray arrayWithArray:mArray]];
}

#pragma mark - Actions
- (IBAction)addObject:(id)sender {
    NSMutableDictionary *dict=[NSMutableDictionary dictionaryWithObjectsAndKeys:@"0",@"id",@"number", @"name", nil];

    NSXMLElement *element=[[NSXMLElement alloc]initWithName:[dict objectForKey:@"name"] stringValue:[dict objectForKey:@"id"]];

    [root insertChild:element atIndex:[self countOfChildren]];

    [self addObjectToChildren:dict];
}

- (IBAction)saveXMLToFile:(id)sender { 
    NSString *fileName = [@"~/myFile.xml" stringByExpandingTildeInPath];
    NSData *xmlData = [xmlDoc XMLDataWithOptions:NSXMLNodePrettyPrint];
    if (![xmlData writeToFile:fileName atomically:YES]) {
        NSBeep();
        NSLog(@"Could not write document out...");
    }
}

@end

xml文件:

<root>
    <number>0</number>
    <number>1</number>
    <number>2</number>
    <number>3</number>
    <number>4</number>
    <number>5</number>
</root>

1 个答案:

答案 0 :(得分:0)

更改tableview中的值时,将更新基础数组,但不会更新XML文档。您需要更新XML文档或从数组中重新创建它以保存已编辑的值。