Вопрос по objective-c, cocoa, xml, parsing – Разбор XML в какао

18

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

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

РЕДАКТИРОВАТ Причина, по которой я хочу создать синтаксический анализатор XML, заключается в получении информации из базы данных MYSQL на сервере в клиентское приложение. Если есть какой-то лучший способ сделать это, кроме анализатора XML, пожалуйста, дайте мне знать!

Я не просто уверен, что я должен переопределить, чтобы это работало. PF1
что не имеет смысла в онлайн-документации? hhafez
Нечего переопределять. Вы создаете отдельный объект и назначаете его делегату синтаксического анализатора. В этом объекте вы отвечаете на определенные сообщения (некоторые обязательные, некоторые необязательные), в которых сообщается, что обнаружил анализатор. Peter Hosey

Ваш Ответ

1   ответ
48

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

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

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

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

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

Тогда в этом же объекте (self) у вас могут быть некоторые из этих методов:

- (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, что означает управляемый событиями синтаксический анализатор. Он находит вещи и говорит вам об этом.

@Dave Как я отформатирую XML как PLIST, и это будет означать, что я мог бы просто создать NSDictionary и так отсортировать? Я также пробовал некоторые вещи с NSXMLParser, и мне интересно, как бы вы предложили использовать команды, которые вы опубликовали выше, чтобы связать элемент и найденные символы. Например, вы знаете, что & quot; Некоторое описание & quot; находится в элементе "Описание". Спасибо за вашу помощь. PF1
Спасибо, Дэйв: Действительно полезно! И в будущем вы бы порекомендовали использовать XML или MYSQL для связи с базой данных / клиентом? PF1
@ PF1, чтобы получить представление о формате plist, откройте файл .plist в ~ / Library / Preferences. Тогда просто имейте PHP-скрипт, который вытаскивает вещи из вашей БД и выводит текст, который выглядит как список. Если вы хотите конкретный пример, вы можете связаться со мной напрямую. знак равно
Я, вероятно, использовал бы оба. Если мне нужно было соединение клиент-сервер, и я контролировал оба конца, я, вероятно, сохранил бы данные в базе данных MySQL, а затем получил бы к ним доступ с помощью некоторых сценариев PHP, которые выплевывали соответствующие данные, отформатированные как XML (Plist XML специально , поэтому я мог бы делать такие вещи, как NSArray * myArray = [NSArray arrayWithContentsOfURL: urlToMyPHPScript];)
@Dave Только что посмотрел некоторые файлы PLIST - похоже, нет большой разницы с обычным XML. Что касается части PHP, кажется довольно простой (я знал PHP еще до того, как начал изучать Какао). :) Если у меня возникнут какие-либо другие вопросы / пожелания, я либо оставлю здесь сообщение, либо отправлю вам электронное письмо. PF1

Похожие вопросы