В iOS есть встроенный класс синтаксического анализа XML, который называется NSXMLParser
.В качестве параметра init
он принимает NSData
, который обычно представляет собой данные, которые вы получаете от веб-службы.Назначьте себя в качестве его делегата и вызовите [parser parse]
, и он вызовет ваш делегат, когда встретит элемент, когда он завершит элемент и т. Д. См. Документацию для синтаксического анализатора и его протокола делегата .
Если у вас есть контроль над структурой вашего XML, мне будет проще, если он структурирован следующим образом:
<Element attr1='value1' attr2='value2' />
вместо:
<Element>
<attr1>value1</attr1>
<attr2>value2</attr2>
</Element>
Причина в том, что обратный вызов, когда он находит элемент:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict
, где attributes
- словарь значений, поэтому в приведенном выше примере [attributes objectForKey:@"attr1"]
даст вам "value1«Если бы он был структурирован первым способом.Если это второй путь, вы в конечном итоге делаете много управления состоянием, что немного проблематично, особенно если у вас есть элементы внутри элементов и т. Д.
В дополнение к NSXMLParser
есть open-sourceпарсеры, которые либо делают все сами, либо оборачивают встроенный парсер.Я написал свою собственную обертку для этого раньше.См. здесь для сообщения на эту тему (спасибо этот вопрос за ссылку).