【问题标题】:Objective-C parse XML to NSManagedObjectsObjective-C 将 XML 解析为 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。

【问题讨论】:

  • 解析时遇到什么错误?

标签: ios objective-c xml core-data nsmanagedobject


【解决方案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>

他是一样的,只是在文件的开头和结尾处有开始和结束标签。叹息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多