Если вы работаете на iPhone, использование синтаксического анализа на основе дерева может стать препятствием для использования памяти. Поверьте мне, я был там, и я пробовал много разных подходов в течение последних пяти месяцев разработки моего основного приложения для iPhone. Синтаксический анализ на основе дерева работает нормально до тех пор, пока вы не загрузите чей-то поток комментариев, содержащий 400 очень длинных комментариев, с тактовой частотой около 600 КБ необработанных данных. Несмотря на размер результирующего дерева XML, память, выделяемая внутри при создании этого дерева, может быть огромной.
Я закончил создание варианта NSXMLParser, который извлекает данные из предоставленного NSInputStream, а не использует один кусок данных, и который передает только 1 КБ за раз в libxml для обработки (NSXMLParser также использует libxml, но передает 100% данных на одном дыхании).
Исходный код доступен на github (смотрите в папке StreamingXMLParser). Вы также найдете там суперкласс делегата; для большинства нужд анализа вы можете создать подкласс AQXMLParserDelegate и реализовать -start[Element]WithAttributes: (NSDictionary *) attrs
и -end[Element]
в своем подклассе. Эти методы будут вызываться для вас при обнаружении начальных и конечных тегов, а внутри конечного тега вы можете использовать self.characters
для доступа к символам содержимого или CDATA элемента.
Дополнительные сведения об относительных объемах памяти различных анализаторов (хотя и на Mac, а не на iPhone) см. В моем исходном сообщении в блоге здесь и в продолжении NSXMLDocument здесь .