iOS XML Парсинг многих документов

в моем приложении мне нужно сделать несколько HTTP-запросов. Все эти запросы возвращают XML-документы, которые необходимо проанализировать, а затем перейти в табличные представления или что-то еще... Это около 10-20 документов во всем приложении. Атрибуты с одинаковыми именами могут встречаться в разных документах, поэтому мне нужно различать их в моих методах делегата.

Мой подход состоял в том, чтобы иметь только 1 класс с методами NSXMLParserDelegate, используя разные синтаксические анализаторы для каждого документа (но с одним и тем же делегатом) и различать синтаксические анализаторы (также известные как документы), используя аргумент синтаксического анализатора в методах делегата. но это становится довольно сложным, и я не хочу иметь кучу разных переменных-экземпляров парсера и предложений if. нет ли более простого способа сделать это? я думал иметь 1 класс на операцию синтаксического анализа (=> разные делегаты), но я думаю, что это еще хуже..


person urz0r    schedule 08.09.2012    source источник
comment
У вас могут быть отдельные экземпляры класса или, если это проще, используйте парсер DOM с libxml2.   -  person Richard J. Ross III    schedule 08.09.2012
comment
С чем вы в итоге пошли?   -  person bryanmac    schedule 09.09.2012


Ответы (2)


Один из вариантов — поместить обратные вызовы делегата XML и/или методы построения данных в объект, который будет создан в результате синтаксического анализа этого конкретного типа xml. Это поместило бы определение объекта вместе со знанием того, как создать его из xml или фрагментов данных в одном месте. Попытка поместить всю логику синтаксического анализа для всех типов в один метод делегата слишком усложняет этот один класс делегата и разделяет знания о каждом из типов, с которыми вы работаете.

Единственная проблема с этим подходом — составные объекты. Например, если у вас есть объект исполнителя, объект альбома, содержащий исполнителя, и вызов, который получает список исполнителей. Один из подходов состоит в том, чтобы составной объект, анализирующий который, откладывался на этот другой класс объектов (возможно, с вашим собственным протоколом). Например, объект альбома анализируется и попадает в элемент «исполнитель». Таким образом, он знает, что нужно выделить исполнителя, и когда он попадет в фрагменты данных из обратных вызовов делегата (пока он не достигнет близкого элемента исполнителя), он будет продолжать вызывать методы вашего протокола, вставляя данные. Это откладывает знание того, что делать с этим фрагментом. данных в класс, который определяет этот объект. Для класса, который обрабатывает список исполнителей, он сделал бы это n раз, создавая список. Вызов, который получает одного исполнителя (делегаты в классе исполнителя), по-прежнему будет вызывать эти методы заполнения блоков данных насыщения для объекта исполнителя.

Наконец, построение объектов по мере анализа XML, если все сделано правильно, может иметь преимущество в виде экономии памяти и повышения производительности. В отличие от буферизации полной строки xml, создание полного XML DOM может использовать больше памяти, что также может быть медленнее для пользователя. Так что подумайте и о производительности.

person bryanmac    schedule 08.09.2012
comment
спасибо, мне нравится этот подход, потому что он соответствует моему пониманию чистого дизайна. к сожалению, ребята, создавшие XML-документы, не думали об объектно-ориентированном подходе... но я попытаюсь с этим справиться. - person urz0r; 10.09.2012

Если ваш XML просто кодирует набор записей, взгляните на https://github.com/ZaBlanc/RaptureXML В RaptureXML вы анализируете блоки, поэтому вам не нужно беспокоиться о создании новых объектов. Вы можете передать имя документа в качестве аргумента блоку синтаксического анализа. Это также в миллион раз более лаконично, чем с помощью NSXMLParser.

person Maciej Trybiło    schedule 08.09.2012
comment
эй, спасибо за ваш ответ. хотя ваше решение, вероятно, было бы проще, я остановился на подходе bryanmacs, главным образом потому, что сначала хотел получить четкое представление об обработке xml. - person urz0r; 10.09.2012