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中:被调用时,您可以通过其实例变量状态为对象提供完整的元素值/正文。
您也可以阅读SAX和DOM解析器之间的区别。 NSXMLParser是一个SAX解析器,它使用起来不太方便,但性能比DOM解析器好。
答
进入一个元素时创建一个字符串,追加到它时,foundCharacters被称为然后检查didEndElement其长度/价值?
答
Jon和Mobs的答案都是正确的,那就是做到这一点的方法。为了更好地理解它的工作原理,我建议你看一下Apple的Seismic XML示例项目。它使用NSXMLParser以非常清晰的方式显示了如何处理您所处的情况。
hi jon, foundCharacters方法对于所有其他标记都被调用一次,但为什么对于上面指定的标记不会被调用一次。我只想知道这件事。但是appendstring也是一个备用 – Rupesh 2010-01-23 11:39:13
SAX解析器扫描源文本并为解析器的委托生成这些回调。该实现可能使用固定大小的缓冲区扫描文本,以便它可以具有内存使用的上限。这意味着你会经常得到部分结果。如果你曾经使用unix read(http://www.opengroup.org/onlinepubs/000095399/functions/read.html)函数完成手动文件IO,这与你不应该编写程序相似得到整个元素的值。你总是需要在缓冲区中构建它们。 – 2010-01-23 21:48:46