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];

其中answerStringstd::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的主要内容,如果未能解决你的问题,请参考以下文章

对数组求和 - Objective-C

Objective-C 将十六进制字符串解析为整数

将 char* 解析为 NSString 在 Objective-C 的第一个新行处停止

Objective-C将十六进制字符串解析为整数

如何在 iOS 上将“MongoDB 日期时间(ISO 日期)”解析为 NSDate(swift 和 Objective-c)

将objective-c typedef转换为其等效的字符串