iPhone: NSCMLParser метод foundCharacters вызывается несколько раз для одного тега - PullRequest
2 голосов
/ 23 января 2010

Я могу разобрать файл XML. но я сталкиваюсь со странной ошибкой. Мой формат файла XML такой:

<contact>
   <contactServiceTag>3B92E6A7-B599-EAE9-1CB7B5592CB8695C</contactServiceTag>
   <contactDeletedBoolean>0</contactDeletedBoolean>
   <contactLinkStatus>Stored</contactLinkStatus>
   <contactName>P4</contactName>
   −
   <contactEmailAddresses>
     <workEmail>updatedp4@isol.co.in</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.

подскажите, пожалуйста, как я могу устранить эту ошибку

Ответы [ 3 ]

4 голосов
/ 23 января 2010

В вашей реализации обратных вызовов <<a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/NSXMLParserDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intf/NSXMLParserDelegate" rel="nofollow noreferrer"> NSXMLParserDelegate >, таких как parser: foundCharacters :, вы должны хранить найденные символы в переменных экземпляра, возможно объединяя строку вместе, так что когда parser: didEndElement: namespaceURI qualName: вызывается, у вас есть полное значение элемента / тело, доступное для вашего объекта через его состояние переменной экземпляра.

Вы также можете прочитать разницу между SAX и DOM парсерами. NSXMLParser - это SAX-парсер, который менее удобен в использовании, но работает лучше, чем DOM-парсеры.

0 голосов
/ 23 января 2010

Ответы Джона и Мобса верны, вот как это сделать. Чтобы лучше понять, как это работает, я предлагаю вам взглянуть на пример проекта Apple Seismic XML . Он очень просто использует NSXMLParser, а также показывает, как справиться с ситуацией, в которой вы находитесь.

0 голосов
/ 23 января 2010

Создание строки при вводе элемента, добавление к нему при вызове foundCharacters и проверка его длины / значения в didEndElement?

...