【问题标题】:NSXMLParser issue : don't get all data?NSXMLParser 问题:不获取所有数据?
【发布时间】:2012-05-27 21:56:29
【问题描述】:

我正在开发一个需要从 XML 文件中获取数据的应用程序。一些节点有很多字符,我在使用这个函数时遇到了问题:

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

例如,对于一个项目的描述节点,我只会得到最后 20-30 个字符,而我会得到 200 或 300 个。

我使用 NSLog 进行了检查,看来问题出在此处。你知道怎么回事吗?

感谢您的建议。

【问题讨论】:

    标签: iphone ios parsing nsxmlparser nsxml


    【解决方案1】:

    SAX 解析器不保证一次获取所有字符。您可能会收到来自任何给定块的字符块的多次调用;您的代码应该将它们连接成一个字符串。

    解析器对象可以向委托发送多个 parser:foundCharacters: 消息来报告元素的字符。因为字符串可能只是当前元素全部字符内容的一部分,所以应该将其追加到当前的字符累积中,直到元素发生变化。

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
        if ([qualifiedName isEqualToString:@"myTag"]) {
            buf = [NSMutableString string];
        }
    }
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
        if ([qualifiedName isEqualToString:@"myTag"]) {
            buf = [buf stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
            NSLog(@"Got %@", buf);
        }
    }
    
    - (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
        [buf appendString:string];
    }
    

    【讨论】:

    • 感谢您的回答。你能给我一个小代码示例,说明什么应该替换 stringByTrimmingCharactersInSet: 以逐个获取字符或逐块获取字符?
    • 您应该将修剪代码移动到委托的parser:didEndElement:namespaceURI:qualifiedName: 方法。在“开始元素”方法中,您应该清除缓冲区,在foundCharacters 方法中,您应该通过调用appendString:string 简单地附加到可变字符串缓冲区。
    • 效果很好,但我还必须将 buf 声明为属性而不是 ivar。再次非常感谢您。
    猜你喜欢
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    相关资源
    最近更新 更多