首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSXMLParser:在iOS应用中以2级深度解析XML

NSXMLParser:在iOS应用中以2级深度解析XML
EN

Stack Overflow用户
提问于 2012-03-13 19:25:00
回答 1查看 653关注 0票数 0

我坚持使用NSXMLParser解析来自远程服务器的XML的问题。XML结构如下所示:

代码语言:javascript
复制
<data>
    <sale id="example01">
        <article>
            <id>123</id>
            <title>Some title</title>
            <teaser>Some text</teaser>
        </article>
        <article>
            <id>124</id>
            <title>Some title</title>
            <teaser>Some text</teaser>
        </article>
    </sale>
    <sale id="example02">
        <article>
            <id>125</id>
            <title>Some title</title>
            <teaser>Some text</teaser>
        </article>
        <article>
            <id>126</id>
            <title>Some title</title>
            <teaser>Some text</teaser>
        </article>
    </sale>
</data>

我成功地解析了XML并将其存储到我的CoreDataModel中,但是解析器似乎只获取了第一个“销售”元素和其中的文章。当进入下一个"sale“元素时,解析器停止,不会出现错误。我经常使用NSXMLParser来解析远程数据,但是我不知道如何解决这个问题。从sales获取属性对我来说很重要,因为我必须创建一个TableView,其中的“sales”元素表示节,而文章定义其中的单元格。

文档上说只能有一个根元素,但我的根元素不是吗?

EDIT#1:下面是我使用的一些代码:

"Verkauf“是绑定到我的CoreDataModel中的新闻实体的DataObject:

代码语言:javascript
复制
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict {


    // If it's the start of the XML, remove everything we've stored so far
    if([elementName isEqualToString:@"daten"])
    {
        [self emptyDataContext];
    }

// Create a new Article

    NSLog(@"Processing Element: %@", elementName);

    if ([elementName isEqualToString:@"article"]) 
    {
        appDelegate.saleArticles = [[NSMutableArray alloc] init];
        currentArticle = (Verkauf *)[NSEntityDescription insertNewObjectForEntityForName:@"Verkauf" inManagedObjectContext:managedObjectContext];

        return;
    }
}

设置元素值:

代码语言:javascript
复制
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    if(!currentElementValue) 
        currentElementValue = [[NSMutableString alloc] initWithString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
    else
        [currentElementValue appendString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];

    NSLog(@"Processing Value: %@" ,currentElementValue);

}

设置元素的值并将其添加到CoreData模型中:

代码语言:javascript
复制
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    // !!! This is never called !!!
    if([elementName isEqualToString:@"sale"]){
        NSLog(@"!!!!!!!!!!!!!!Section End!!!!!!!!!!!!!!!!!!!!!!!");
        return;
    }

    // If we're at the end of a county. Save changes to object model
    if ([elementName isEqualToString:@"article"]) 
    {
        [appDelegate.saleArticles addObject:currentArticle];
        // Sanity check
        if(currentArticle != nil)
        {
            NSError *error;

            // Store what we imported already
            if (![managedObjectContext save:&error]) {

                // Handle the error.
                NSLog(@"%@", [error domain]);
            }
        }
        return;
    }
    else if([elementName isEqualToString:@"teaser"]){
        [currentArticle setTeaser:currentElementValue]; 
    }

    else if( ..... };

EDIT#2:我的初始化方法:

代码语言:javascript
复制
- (BOOL)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error
{
    BOOL result = YES;

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
    // Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks.
    [parser setDelegate:self];
    // Depending on the XML document you're parsing, you may want to enable these features of NSXMLParser.
    [parser setShouldProcessNamespaces:NO];
    [parser setShouldReportNamespacePrefixes:NO];
    [parser setShouldResolveExternalEntities:NO];

    [parser parse];

    NSError *parseError = [parser parserError];
    if (parseError && error) {
        *error = parseError;
        result = NO;
    }

    // deactivated because of ARC
    //    [parser release];

    return result;
}
EN

回答 1

Stack Overflow用户

发布于 2012-03-13 20:07:37

我在您的代码或XML中都看不到任何东西(尽管我注意到您可能对XML进行了英语化),所以要么是我漏掉了(很可能),要么就是它有些奇怪。

NSXMLParser将为您提供比您提供的更多的信息。parse方法返回一个BOOL。它返回的是什么?如果它是一个NO,您可以使用parserError方法来获取一个NSError对象,该对象将为您提供更多信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9683047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档