NSXMLParser在找到非常初的实例时停止运行

时间:2015-01-26 17:57:03

标签: objective-c nsxmlparser

我正在尝试使用NSXMLParser解析此XML。我有多个"咖啡"在XML文件中,如下所示:

… More XML
<Coffee>
        <Type Name="Type">Minimum Drinking Amount</Type>
            </Coffee>   
<Coffee>
        <Type Name="Type">Maximum Drinking Amount</Type>
            </Coffee>
… More XML

现在,一旦NSXMLParser找到&#34; Coffee&#34;的第一个实例,就完成并转移到XML的其余部分。哪个......好不好,我不喜欢它。我需要它来阅读&#34; Coffee&#34;的所有实例。这就是我在Objective-C中处理它的方式。

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    NSLog(@"Fired Stick1");

    _xmlString = elementName;

    if ([_xmlString isEqualToString:@"Coffee"]) {
        NSLog(@"Stick1 Coffee:");
    }

    if ([_xmlString isEqualToString:@"Tea"]) {
        NSLog(@"Stick1 Tea:");
}

然后是foundCharacters委托:

-(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

    if ([_xmlString isEqualToString:@"Coffee"] || [_xmlString isEqualToString:@"Tea"]) {
        NSLog@"%@ Called", _xmlString);
     }
    if (!_coffeeString) {
        _coffeeString = [[NSMutableString alloc] initWithString:string];
    }
    else {
        _coffeeString = string;
    }

    if (coffeeArray == NULL) {
        NSLog(@"Stick1 the coffeeArray was null");
        coffeeArray = [[NSMutableArray alloc] init];
    }

    //add the returned string into an array
    [coffeeArray addObject:_coffeeString];
    NSLog(@"Stick1 array %@", coffeeArray);

    // parse the returned data in array
    NSString *seperate = [coffeeArray componentsJoinedByString:@"\n"];
    NSLog(@"Stick1 seperate is %@", seperate);

    // another parsing
    NSArray* words = [seperate componentsSeparatedByCharactersInSet :[NSCharacterSet whitespaceAndNewlineCharacterSet]];
                                                                                            //or use newLineCharecterSet
    // Take out all of the whitespace like tabs and spaces and new lines
    _singleName = [words componentsJoinedByString:@""];

    NSLog(@"Stick1 final result %@", _singleName);
}

基本上,它会被调用两次,但不会显示两组数据。一旦找到咖啡,它会显示咖啡的第一部分(最小值),但无法显示第二个咖啡实例(最多)。

1 个答案:

答案 0 :(得分:1)

我认为你有几个问题正在发生。一个是(至少使用提供的XML),<Coffee>...</Coffee>定义了一个完整的XML文档,因此您可能会收到一个未处理的解析错误。您应该在NSXMLParserDelegate中实现以下代码,并查看报告的问题:

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSLog(@"error: %@", parseError);
}
- (void)parser:(NSXMLParser *)parser validationErrorOccurred:(NSError *)validationError {
    NSLog(@"error: %@", validationError);
}

您还有一些问题,即您尝试根据节点的标记名称(elementName)在代码中设置触发器/标记,但实际上您关心的是子网中包含的数据节点

此外,parser:foundCharacters: NOT 保证在一个字符串中返回标记的全部内容,因此您处理两者 {{ 1}} parser:didStartElement:...。然后,在parser:didEndElement:...中,您可以确保自己位于适当的节点中,并追加找到已找到的字符。

以下是一些示例代码,可根据您提供的数据开始使用

  

注意:我只是在拍摄你真正想要的东西,因为你的数据有点模糊。此外,我在一个全新的单一视图应用程序的App Delegate中做到了这一点。这是 NOT 实现真正实现的方式!

parser:foundCharacters: