2009-08-22 4 views
2

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

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

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

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

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

ответ

4

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

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

  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

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

Установите анализатор вверх:

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

заместить эти методы:

– parser:didStartElement:namespaceURI:qualifiedName:attributes:
– parser:didEndElement:namespaceURI:qualifiedName:
– parser:foundCharacters:

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

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

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

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

[elementName isEqualToString:@"status"]

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

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

...

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

...

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

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

+0

Спасибо вам обоим. Наконец, я получил его на работу. – SonnyBurnette