Как мне разобрать базовый XML-файл с NSXMLParser? - PullRequest
2 голосов
/ 22 августа 2009

Я пытаюсь выяснить NSXMLParser для своего приложения для iPhone, и хотя я обычно понимаю, как оно работает, я все еще немного озадачен тем, как извлечь нужные мне значения.

Результат XML, который я анализирую, очень прост. это так:

<start>
 <status>300</status>
 <record>
  <title>The Title</title>
  <content>Some content</content>
 </record>
</start>

Мне нужно сделать 3 вещи: Получить значение статуса. Получить значение контента из первой записи. Может появиться ответ, который предлагает несколько «записей» элементов, поэтому мне нужно получить только первый.

Я не могу понять, как это просто сделать. Большинство всех примеров, которые я видел, включают создание отдельного объекта для заполнения этими данными, и я не вижу необходимости в двух значениях. Кто-нибудь может подсказать, как вытащить эти 2 куска данных и только для первой записи?

Ответы [ 2 ]

4 голосов
/ 22 августа 2009

Первое, что происходит, когда NSXMLParser встречает тег XML, это то, что вызывается метод делегата parser:didStartElement:namespaceURI:qualifiedName:attributes:; Вам, вероятно, нужно будет использовать здесь только переменную elementName. Затем анализатор XML читает символы в теге и вызывает parser:foundCharacters: с содержимым. Наконец parser:didEndElement:namespaceURI:qualifiedName называется.

Подход, который я выбрал, как Apple использует в примере SeismicXML , заключается в использовании следующих методов:

  1. В parser:didStartElement:namespaceURI:qualifiedName:attributes: сравните строку имени элемента с известным значением, чтобы увидеть, является ли эта строка интересующей вас. Если так, тогда установите переменную экземпляра (NSMutableString; я назову ее contentOfCurrentXMLProperty) в пустую строку. В противном случае установите значение nil.
  2. В parser:foundCharacters: добавьте найденные символы к contentOfCurrentXMLProperty.
  3. В parser:didEndElement:namespaceURI:qualifiedName присвойте значение contentofCurrentXMLProperty любой соответствующей переменной.

См. Пример SeismicXML для получения дополнительной информации.

Несколько вещей о вашем конкретном случае: во-первых, поскольку анализатор XML возвращает только строки, вам необходимо преобразовать строку в целое число (или любой тип данных, который вы используете) для status.

Во-вторых, поскольку вам нужно только первое значение для record, в parser:didStartElement:... я бы установил BOOL, который будет указывать, видели ли вы уже тег record ранее, и, если это так, установить contentOfCurrentXMLProperty до nil.

2 голосов
/ 22 августа 2009

Помня, что NSXMLParser - это SAX-подобный анализатор событий, основанный на событиях, вы должны настроить свой анализатор, запустить его и прослушивать ключевые события.

Настройка парсера:

NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];<br> [parser setDelegate:self];<br> [parser parse];

Переопределите эти методы:

– parser:didStartElement:namespaceURI:qualifiedName:attributes:<br> – parser:didEndElement:namespaceURI:qualifiedName:<br> – parser:foundCharacters:

Ваша функция должна в основном сказать:

  • Когда вы достигнете следующего начала тега:

-(void)parser: didStartElement:(NSString *) namespaceURI:(NSString *) qualifiedName:(NSString *) attributes:(NSDictionary *)

  • Если имя этого тега "status":

[elementName isEqualToString:@"status"]

  • Дайте мне строковые данные тега:

- (void)parser:(NSXMLParser *) foundCharacters:(NSString *)

...

[<your statusValueHolder as NSMutableString> appendString:<foundCharacters' parameter>]

...

Вы можете применить ту же логику для другого случая (поиск первого начала тега с именем «record», отмена при достижении конца тега с именем «record» и т. Д.)

Посмотрите на это и попробуйте дома: Сделайте NSXMLParser своим другом. Также см. Справочные документы API для NSXMLParser для дополнительных методов делегата для делегата NSXMLParser.

...