2010-01-23 38 views
2

我能夠解析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方法。

請建議如何解決這種類型的錯誤

回答

4

在你執行< 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

0

進入一個元素時創建一個字符串,追加到它時,foundCharacters被稱爲然後檢查didEndElement其長度/價值?

0

Jon和Mobs的答案都是正確的,那就是做到這一點的方法。爲了更好地理解它的工作原理,我建議你看一下Apple的Seismic XML示例項目。它使用NSXMLParser以非常清晰的方式顯示瞭如何處理您所處的情況。

相關問題