iPhone:NSXMLParser的foundCharacters方法被称为多个时间单标签

iPhone:NSXMLParser的foundCharacters方法被称为多个时间单标签

问题描述:

我能够解析XML文件。但我面临奇怪的错误。我的XML文件格式是这样的iPhone:NSXMLParser的foundCharacters方法被称为多个时间单标签

<contact> 
    <contactServiceTag>3B92E6A7-B599-EAE9-1CB7B5592CB8695C</contactServiceTag> 
    <contactDeletedBoolean>0</contactDeletedBoolean> 
    <contactLinkStatus>Stored</contactLinkStatus> 
    <contactName>P4</contactName> 
    − 
    <contactEmailAddresses> 
    <workEmail>[email protected]</workEmail> 
    <personalEmail/> 
    <otherEmail/> 
    </contactEmailAddresses> 
    <contactLastUpdated>{ts '2010-01-22 10:05:42'}</contactLastUpdated> 
    <contactPhotoExists>False</contactPhotoExists> 
</contact> 

分析过程中,当解析器解析contactLastUpdated的元素,然后foundCharacters方法称为多时间,它在第一次运行返回值{TS\ '第二次运行,2010-01-22 10:05:42第三次运行,\'第四次运行,最后是}上次运行。所以我只有最后一个值(})当我调用didEndElement方法。

请建议如何解决这种类型的错误

在你执行< NSXMLParserDelegate>回调像语法分析器:foundCharacters :,你应该存储找到字符的实例变量,可能是连接字符串在一起,这样,当分析器:didEndElement:的namespaceURI:qualifiedName中:被调用时,您可以通过其实例变量状态为对象提供完整的元素值/正文。

您也可以阅读SAXDOM解析器之间的区别。 NSXMLParser是一个SAX解析器,它使用起来不太方便,但性能比DOM解析器好。

+0

hi jon, foundCharacters方法对于所有其他标记都被调用一次,但为什么对于上面指定的标记不会被调用一次。我只想知道这件事。但是appendstring也是一个备用 – Rupesh 2010-01-23 11:39:13

+0

SAX解析器扫描源文本并为解析器的委托生成这些回调。该实现可能使用固定大小的缓冲区扫描文本,以便它可以具有内存使用的上限。这意味着你会经常得到部分结果。如果你曾经使用unix read(http://www.opengroup.org/onlinepubs/000095399/functions/read.html)函数完成手动文件IO,这与你不应该编写程序相似得到整个元素的值。你总是需要在缓冲区中构建它们。 – 2010-01-23 21:48:46

进入一个元素时创建一个字符串,追加到它时,foundCharacters被称为然后检查didEndElement其长度/价值?

Jon和Mobs的答案都是正确的,那就是做到这一点的方法。为了更好地理解它的工作原理,我建议你看一下Apple的Seismic XML示例项目。它使用NSXMLParser以非常清晰的方式显示了如何处理您所处的情况。