Как разобрать базовый файл XML с помощью NSXMLParser?

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

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

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

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

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


person SonnyBurnette    schedule 22.08.2009    source источник


Ответы (2)


Первое, что происходит, когда 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.

person Community    schedule 22.08.2009

Имея в виду, что 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>]

...

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

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

person Dimitar Dimitrov    schedule 22.08.2009