【问题标题】:Writing NSArray of NSDictionary to file as XML将 NSDictionary 的 NSArray 作为 XML 写入文件
【发布时间】:2013-07-11 12:27:59
【问题描述】:

我有点卡在目标 c 函数上,正在寻求帮助!

这是一个 OSX 应用程序,它从 twitter 中提取数据作为数组,然后将它们插入到 Core Data 中。

我在 Core Data 中有大量对象,我想将它们作为 XML 写入文件,我有一个 fetch 请求过滤并返回我想作为 XML 写入磁盘的库对象数组。

我一直在网上查看各种库和教程,它们似乎都以阅读而不是写作为导向,而且它是一系列库的事实似乎也使事情变得复杂。

到目前为止,我已经尝试过了,但它似乎从未创建文件,但令人讨厌的是也没有给我任何错误:

-(void)writeTweetsToXML{
//Create new fetch request
NSFetchRequest *request = [[NSFetchRequest alloc] init];

//Set new predicate to only fetch tweets that have been favourited
NSPredicate *filterFavourite = [NSPredicate predicateWithFormat:@"approved == YES"];

//Setup the Request
[request setEntity:[NSEntityDescription entityForName:@"Tweet"    inManagedObjectContext:_managedObjectContext]];

//Assign the predicate to the fetch request
[request setPredicate:filterFavourite];
NSError *error = nil;

//Create an array from the returned objects
NSArray *tweetsToExport = [_managedObjectContext executeFetchRequest:request error:&error];
NSAssert2(tweetsToExport != nil && error == nil, @"Error fetching events: %@\n%@", [error localizedDescription], [error userInfo]);

//for (id obj in tweetsToExport)
  //NSLog(@"obj: %@", obj);


NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *path = [NSString stringWithFormat:@"%@/tweets.xml", documents];
NSString *writeerror;

if(tweetsToExport) {
    [tweetsToExport writeToFile:path atomically:YES];
    NSLog(@"%@ written to %@", tweetsToExport, path);
}
else {
    NSLog(@"%@",writeerror);

}


}

这是托管对象的结构:

@property (nonatomic, retain) NSString * text;
@property (nonatomic, retain) NSString * userName;
@property (nonatomic, retain) NSString * realName;
@property (nonatomic, retain) NSString * avatarUrl;
@property (nonatomic, retain) NSString * tweetID;
@property (nonatomic, retain) NSNumber * approved;
@property (nonatomic, retain) NSDate * postDate;
@property (nonatomic, retain) NSDecimalNumber * longitude;
@property (nonatomic, retain) NSDecimalNumber * latitude;
@property (nonatomic, retain) NSNumber * profanity;
@property (nonatomic, retain) NSString * otherUserTweet;
@property (nonatomic, retain) NSString * favouriteTweet;

任何有用的信息或库的指针都会非常有帮助!

谢谢

加雷斯

编辑 1 好的,已经尝试将数组重新编码为数据,并稍微修改了代码以报告写入成功/失败,没有编码我得到了一个失败的写入,但是现在输出基本上是垃圾。

代码如下:

    NSDictionary* environ = [[NSProcessInfo processInfo] environment];
BOOL inSandbox = (nil != [environ objectForKey:@"APP_SANDBOX_CONTAINER_ID"]);
NSLog(@"App Sandbox Status = %d", inSandbox);

NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *path = [NSString stringWithFormat:@"%@/tweets.xml", documents];
NSString *writeerror;
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:tweetsToExport];
if(tweetsToExport) {
    BOOL successful = [data writeToFile:path atomically:YES];
    NSLog(@"Success = %d", successful);
}
else {
    NSLog(@"%@",writeerror);

}

但是这会产生垃圾输出:

bplist00‘úùX$versionX$objectsY$archiverT$top܆Ø$*+,-./04:FMDRSXfghijknsxÜáàâäãéìòU$null“    
ZNS.objectsV$class£
ÄÄÄÄ#›
      !"#$%&'(^otherUserTweetWtweetIDXrealNameXapprovedYlongitudeXpostDateXlatitudeYavatarUrlYprofan    ityXuserNameTtext^favouriteTweetÄÄÄÄÄÄ  Ä
ÄÄÄÄÄÄ_wPS Myself alongside the mighty @CJbeatz will be co-hosting and DJ for a huge gig      for schools at Wembley Arena this Wed.\TherealNihalWNihal         A_Qhttp://a0.twimg.com/profile_images/1021089851/BB213320_RADIO_1_-   _NIHAL_normal.jpg_353964930917085186“1
 23WNS.time#A∑ⲶÄ
“5678Z$classnameX$classesVNSDate¢79XNSObject◊
;<=>?    @ABCD/DC[NS.mantissa[NS.negative[NS.exponent^NS.mantissa.boYNS.lengthZNS.compactÄO“56GH_NSDeci    malNumberPlaceholder•IJKL9_NSDecimalNumberPlaceholder_NSDecimalNumberXNSNumberWNSValue◊
;<=>?@AOCD/DCÄORNO“56TUUTweet£VW9UTweet_NSManagedObject›
Z[ ]^_`%b'dÄÄÄÄÄÄÄÄÄÄÄÄÄ_"Bird. Bath. http://t.co/1PLF2gKI4T[DerrenBrown\Derren     Brown_Zhttp://a0.twimg.com/profile_images/3682019430/d4636e8301b238c6a10c55efacd2442c_normal.j     peg_353965570888192000“1
l3#A∑âˇ@Ä
◊
;<=>?@ApCD/DCÄO◊
;<=>?@AuCD/DCÄO›
z{ }~Ä%Ç'ÑÄÄÄÄÄ!Ä Ä"ÄÄÄÄÄÄ_âThe Surgery with myself and new resident Doctor @DrRadhaModgil     starts at 9pm on @BBCR1 It's a Summer Special - 03700100100, Text on 81199Sahj_Aled Haydn     Jones_Mhttp://a0.twimg.com/profile_images/2254837339/Aled-012_-        _Version_3_normal.jpg_353965267564507138“1
å3#A∑â˛ˆÄ
◊
;<=>?@AêCD/DCÄO◊
;<=>?@AïCD/DCÄO“56ôö^NSMutableArray£ôõ9WNSArray_NSKeyedArchiver—ûüTrootÄ#-27^dit{ÅÉÖᢠ   ±π¬À’fiÁÒ˚  "$&(*,.02¨π¡*,19BDIT]dgpãó£≤º«…‹›fl‡Â%7@HWYlmnqv|ÄÜò≥µ∑πªΩø¡√≈«…ÀÕÚ˛h}Çãçúû    ±≤≥¬ƒ◊ÿŸÙˆ¯˙¸˛
öû±$&57JKL[]pqrwÜäí§ß¨†Æ

编辑 2

好的,所以,如果我在合适的查看器(BBEdit)中打开这个文件,它的格式是好的,但它并不是很有用,我想要做的就是将带有值的对象编码为 XML,任何非常感谢您的帮助。

【问题讨论】:

  • 您确定不是在写入文件吗?它将位于文档目录中,可能有点难以找到。
  • 就像在 /Users/Me/Documents 中一样,是的,绝对不存在。

标签: objective-c xml core-data nsarray nsdictionary


【解决方案1】:

您的第一次尝试失败了,因为 writeToFile:atomically: 仅适用于属性列表类型 - NSStringNSNumberNSDataNSDateNSArrayNSDictionaryNSManagedObject 不在列表中,您可能创建的任何子类也不在列表中。您不是在尝试编写字典数组,而是在尝试编写托管对象数组。

转换为NSData 并编写工作,但你得到的是一个二进制属性列表。它不是垃圾,它是该代码的预期格式,但它的设计初衷不是为了人类可读。

如果您获取了原始代码,但在执行提取之前添加了此代码:

[request setResultType:NSDictionaryResultType];

...你会得到一些你可以writeToFile:atomically:.

【讨论】:

  • 哈,令人沮丧的是,我在您发布之前大约十秒钟就到达了那里!完全有意义并且有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2010-11-27
  • 2011-10-26
  • 2011-08-13
  • 1970-01-01
相关资源
最近更新 更多