【问题标题】:NSXML parsing loops 3 times over 1 nodeNSXML 解析循环 3 次超过 1 个节点
【发布时间】:2011-06-10 08:45:51
【问题描述】:

我正在使用 NSXMLParser 来解析 XML 文件。为了不同的目的,我在我的应用程序中多次这样做。我有一个解析商店定位器的注释,一个解析来自某个 YouTube 频道的所有电影,最后一个解析自制的 XML 文件。

除了最后一个之外,所有解析器都工作得很好。由于某种原因,它会解析,即第一个节点很好,但随后会覆盖它。

这是我的解析器代码:

    //Standard function parser: reading open tag
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
      namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
        attributes:(NSDictionary *)attributeDict{ 
        currentElement = [elementName copy];
        if ([elementName isEqualToString:@"item"]) {
            xmlArray = [[NSMutableDictionary alloc] init];
        }

    }


    //Standard function parser: reading string
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
        if ([currentElement isEqualToString:@"created_time"]){
            [xmlArray setObject:string forKey:currentElement]; 
            NSLog(@"test 1 %@", string);}
    }    


    //Standard function parser: reading close tag
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
      namespaceURI:(NSString *)namespaceURI
     qualifiedName:(NSString *)qName{ 
        if ([elementName isEqualToString:@"item"]) {
            Post *newPost = [[Post alloc] init];
            NSLog(@"test %@", xmlArray );
            newPost.created_time = [xmlArray objectForKey:@"created_time"];
            [containerArray addObject:newPost];
            [xmlArray release];


 }
}  

XML 如下所示:

<?xml version="1.0" encoding="UTF-8" ?> 
<items>
<item> 
<created_time>test</created_time> 
<message>blabla</message> 
<picture>http://www.trentshow.com/images/tada.jpg</picture> 
</item>
</items>

日志输出如下:

2011-06-10 10:43:24.446 TabbedCalculation[1502:207] test 1 test
2011-06-10 10:43:24.448 TabbedCalculation[1502:207] test 1  
2011-06-10 10:43:24.449 TabbedCalculation[1502:207] test 1 
2011-06-10 10:43:24.450 TabbedCalculation[1502:207] test {
    "created_time" = "\n";
}

我不明白为什么解析器会在 created_time 节点上循环 3 次。任何帮助都会很棒!

【问题讨论】:

  • 替换 currentElement = [elementName copy];与 currentElement=elementName;
  • 好吧,遗憾的是它没有给出任何改变。还是一样的日志。
  • 使用 NSLog(@"%@",currentElement); currentElement=[elementName 副本]之后;并查看它是否正确打印 currentElement。

标签: iphone objective-c ios nsxmlparser


【解决方案1】:

尝试以下解决方案 - 应该可以。 foundCharacters 可以为每个键值调用多次 --- 基本上你应该附加所有找到的字符列表。

   - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
            if ([currentElement isEqualToString:@"created_time"]){
                NSString *valueKey = [xmlArray ValueForKey:forKey:currentElement];
                if(nil != valueKey) 
                {
                   valueKey = [valueKey stringByAppendingString:string];
                }else
                {
                   valueKey = string;
                }
                [xmlArray setObject:valueKey forKey:currentElement]; 
                NSLog(@"test 1 %@", string);}
        } 

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    相关资源
    最近更新 更多