2009-07-06 2 views
18

Сегодня я изучаю, как сделать простой парсер XML в Cocoa (для рабочего стола). Я думаю использовать NSXMLParser для анализа данных, но я не совсем уверен, с чего начать. XML-файл в Интернете не содержит в нем большого количества данных, просто список с несколькими вещами, которые мне нужно сохранить в переменной. Есть ли у кого-нибудь какие-либо предложения о том, как это сделать, поскольку онлайн-документация об этом не имеет особого смысла.Анализ XML в Cocoa

Спасибо за помощь!

EDIT Причина, по которой я хочу создать синтаксический анализатор XML, заключается в том, чтобы получить информацию из базы данных MYSQL на сервере в клиентское приложение. Если есть лучший способ сделать это, кроме синтаксического анализатора XML, пожалуйста, дайте мне знать!

+0

Что не имеет смысла в онлайн-документации? – hhafez

+0

Я не просто уверен, что я должен переопределить, чтобы заставить его работать. – PF1

+0

Нечего переоценивать. Вы делаете отдельный объект и назначаете его делегатом парсера. В этом объекте вы отвечаете на определенные сообщения (некоторые требуются, некоторые необязательные), которые сообщают вам, что нашел парсер. –

ответ

48

Вот как это работает:

Там есть класс называется NSXMLParser. Он используется для анализа XML-файлов. Однако NSXMLParser глуп. Все, что он знает, как это сделать, - это проанализировать XML, но он не знает, что он должен делать с информацией, которую он находит.

Введите делегата. Делегат - как няня. Поскольку XMLParser не имеет понятия, что делать с информацией, которую он находит, он идет и просит своего делегата обо всех: «Эй, я начал разбирать документ! Я должен что-нибудь сделать?» «Эй, я нашел какой-то CDATA! Что я должен делать с этим!» «Эй, я нашел еще один тег!» «Эй, я нашел закрывающий тег!» И так далее. Все эти «Эй!» операторы - это методы делегата, или, другими словами, они являются необязательными методами, которые объект-делегат может реализовать. Обычно (но не всегда) объект, создающий NSXMLParser, также является делегатом, но это не обязательно.

Таким образом, вы могли бы иметь что-то вроде этого:

NSXMLParser * parser = [[NSXMLParser alloc] initWithContentsOfURL:someURLToAnXMLFile]; 
[parser setDelegate:self]; 
[parser parse]; 
[parser release]; 

Затем в том же объекте (само), вы можете иметь некоторые из этих методов:

- (void)parserDidStartDocument:(NSXMLParser *)parser { 
    //the parser started this document. what are you going to do? 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { 
    //the parser found an XML tag and is giving you some information about it 
    //what are you going to do? 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    //the parser found some characters inbetween an opening and closing tag 
    //what are you going to do? 
} 

- (void)parserDidEndDocument:(NSXMLParser *)parser { 
    //the parser finished. what are you going to do? 
} 

Есть целый букет из них методы, перечисленные в документации. Просто перейдите к ссылке на NSXMLParser, и все они перечислены в разделе «Методы делегатов». После того, как вы получите его, NSXMLParser довольно прост в использовании. Это SAX Parser, что означает, что это парсер, управляемый событиями. Он находит материал, и он рассказывает вам об этом.

+0

Спасибо Дэйв: Действительно полезно! И, в будущем, вы бы рекомендовали использовать XML или MYSQL для обмена данными с базами данных/клиентом? – PF1

+3

Я бы, вероятно, использовал оба. Если мне понадобилось соединение клиент-сервер, и я контролировал оба конца, я бы, вероятно, сохранил данные в базе данных MySQL, а затем обратился к нему с помощью некоторых PHP-скриптов, которые выплевывают соответствующие данные, которые отформатированы как XML (Plist XML специально, поэтому Я мог бы делать что-то вроде NSArray * myArray = [NSArray arrayWithContentsOfURL: urlToMyPHPScript];) –

+0

@Dave Как бы форматировать XML как PLIST, и это означало бы, что я мог бы просто создать NSDictionary и отсортировать его так? Я также пробовал некоторые вещи с NSXMLParser, и мне интересно, как вы предложите использовать команды, которые вы разместили выше, чтобы связать элемент и найденные символы. Например, вы знаете, что «Некоторое описание» находится в элементе «Описание». Спасибо за вашу помощь. – PF1