1

我正在制作一个 mac 应用程序,我需要它来解析本地 xml 文件并将其显示到 tableView 中。出于某种原因,我的 tableView 中有一个空白行,这没有任何意义,因为它在我的 xml 中找到了字符。这是我的代码:

- (void)parserDidStartDocument:(NSXMLParser *)parser{
    NSLog(@"found file and started parsing");
}

- (void)parseXMLFileAtURL:(NSString *)URL
{
    //you must then convert the path to a proper NSURL or it won't work
    NSURL *xmlURL = [NSURL URLWithString:URL];

    // here, for some reason you have to use NSClassFromString when trying to alloc NSXMLParser, otherwise you will get an object not found error
    // this may be necessary only for the toolchain

    rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];


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

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSString * errorString = [NSString stringWithFormat:@"Unable to download XML feed (Error code %i )", [parseError code]];
    NSLog(@"Error parsing XML: %@", errorString);
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    //NSLog(@"found this element: %@", elementName);
    currentElement = [elementName copy];

    if ([elementName isEqualToString:@"event"]) {
        // clear out our story item caches...
        item = [[NSMutableDictionary alloc] init];
        date = [[NSMutableString alloc] init];
        opponent = [[NSMutableString alloc] init];
        location = [[NSMutableString alloc] init];
        time = [[NSMutableString alloc] init];
        games = [[NSMutableString alloc] init];

    }

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    NSLog(@"ended element: %@", elementName);

    if ([elementName isEqualToString:@"event"]) {
        // save values to an item, then store that item into the array...
        [item setObject:date forKey:@"date"];
        [item setObject:opponent forKey:@"opponent"];
        [item setObject:location forKey:@"location"];
        [item setObject:time forKey:@"time"];
        [item setObject:games forKey:@"games"];
        NSMutableArray *stories = [[NSMutableArray alloc] init];
        [stories addObject:[item copy]];

        [arrayController addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                                    date, @"date", 
                                    opponent, @"opponent",
                                    location, @"location",
                                    time, @"time",
                                    games, @"games"
                                    , nil]];

    }

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    //NSLog(@"found characters: %@", string);
    // save the characters for the current item...

    if ([date isEqualToString:@"date"]) {
        [date appendString:string];
    } else if ([opponent isEqualToString:@"opponent"]) {
        [opponent appendString:string];
    } else if ([location isEqualToString:@"location"]) {
        [location appendString:string];
    } else if ([time isEqualToString:@"time"]) {
        [time appendString:string];
    } else if ([games isEqualToString:@"games"]) {
        [games appendString:string];
    }
}

- (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSLog(@"all done!");
    [tabelview reloadData];
}

当我删除我的添加部分时,它将项目添加到 arraycontroller,并添加

[arrayController addObject:stories];我得到了一堆('s

如果您还有其他需要,不要只是投反对票,而是告诉我。谢谢!

这是我的xml:

    <?xml version="1.0" encoding="ISO-8859-1"?>
<xmlData>
    <event>
        <date>date here</date>
        <opponent>opponent here</opponent>
        <location>location here</location>
        <time>time here</time>
        <games>games here</games>
    </event>
    <event>
        <date>date here</date>
        <opponent>opponent here</opponent>
        <location>location here</location>
        <time>time here</time>
        <games>games here</games>
    </event>
    <event>
        <date>date here</date>
        <opponent>opponent here</opponent>
        <location>location here</location>
        <time>time here</time>
        <games>games here</games>
    </event>
    <event>
        <date>date here</date>
        <opponent>opponent here</opponent>
        <location>location here</location>
        <time>time here</time>
        <games>games here</games>
    </event>
</xmlData>
4

2 回答 2

1

错误在您的解析器中。请修改逻辑。item填充表格视图数组时,您没有使用您的对象。此外,您没有捕捉 XML 元素之间的文本,也没有将它们分配给适当的变量。

请注意以下事项:

  • 当您输入一个元素时,跟踪您当前所在的元素
  • 当您找到字符时,您必须根据您所在的元素填充适当的属性变量
  • 完成event元素后,您应该将您item的所有填充键添加到数据数组中。
于 2013-02-03T19:11:55.783 回答
0

你需要知道如何使用数组。您正在分配一个数组stories。但后来没有使用。请检查您的 didEndElement 方法。

创建一类事件,创建 .h 和 .m 文件,然后创建所有元素的属性,然后将事件类的整个对象添加到数组中。您可以在 appHandler 或 Single ton 类中使用该数组。

检查这件事。愿它帮助你。

于 2013-02-03T20:50:11.137 回答