Objective-C 将 XML 解析为 NSManagedObjects
Posted
技术标签:
【中文标题】Objective-C 将 XML 解析为 NSManagedObjects【英文标题】:Objective-C parse XML to NSManagedObjects 【发布时间】:2014-02-24 05:40:18 【问题描述】:我在做什么:解析 XML 以创建 NSManagedObject 子类并且总是解析失败。
代码在这里:
NSData* data = [[NSString stringWithUTF8String:answerString.c_str()] dataUsingEncoding:NSUTF8StringEncoding];
NSXMLParser *nsXmlParser = [[NSXMLParser alloc] initWithData:data];
XMLParser *parser = [[XMLParser alloc] initXMLParser];
[nsXmlParser setDelegate:parser];
BOOL success = [nsXmlParser parse];
其中answerString
是std::string
。而且我总是在success
标志中获得NO
。
我的对象类:
@interface System : NSManagedObject
@property (nonatomic, retain) NSString * systemFullName;
@property (nonatomic, retain) NSString * systemShortName;
@end
我的解析器头:
@class System;
@interface XMLParser : NSObject <NSXMLParserDelegate>
NSMutableString *currentElementValue;
System *system;
- (XMLParser *) initXMLParser;
及实施:
- (XMLParser *) initXMLParser
self = [super init];
return self;
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict
if ([elementName isEqualToString:@"System"])
system = [NSEntityDescription insertNewObjectForEntityForName:@"System"
inManagedObjectContext:((AppDelegate*)[[UIApplication sharedApplication]
delegate]).managedObjectContext];
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
if (!currentElementValue)
currentElementValue = [[NSMutableString alloc] initWithString:string];
else
[currentElementValue appendString:string];
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
NSManagedObjectContext *context = ((AppDelegate*)[[UIApplication sharedApplication]
delegate]).managedObjectContext;
if ([elementName isEqualToString:@"System"])
[context save:nil];
system = nil;
if ([elementName isEqualToString:@"systemFullName"])
system.systemFullName = currentElementValue;
if ([elementName isEqualToString:@"systemShortName"])
system.systemShortName = currentElementValue;
有什么想法吗?
我偶然发现,当方法 didEndElement
找到第一个对象的结尾时,XMLParser 会停止工作并出现错误 111。
【问题讨论】:
解析时遇到什么错误? 【参考方案1】:我解决了这个问题。而不是这样的 XML 格式:
<System>
<systemFullName>aaaa</systemFullName>
<systemShortName>a</systemShortName>
</System>
<System>
<systemFullName>bbbb</systemFullName>
<systemShortName>b</systemShortName>
</System>
我使用了这种格式:
<startXML>
<System>
<systemFullName>aaaa</systemFullName>
<systemShortName>a</systemShortName>
</System>
<System>
<systemFullName>bbbb</systemFullName>
<systemShortName>b</systemShortName>
</System>
</startXML>
他是一样的,只是在文件的开头和结尾处有开始和结束标签。叹息。
【讨论】:
以上是关于Objective-C 将 XML 解析为 NSManagedObjects的主要内容,如果未能解决你的问题,请参考以下文章
将 char* 解析为 NSString 在 Objective-C 的第一个新行处停止
如何在 iOS 上将“MongoDB 日期时间(ISO 日期)”解析为 NSDate(swift 和 Objective-c)