Почему NSXMLParser выбирает этот пробел в методе foundCharacters?

Я учусь использовать NSXMLParser API для платформы iOS, и пока им очень легко пользоваться. Однако у меня возникла небольшая проблема в методе foundCharacters. Насколько я понимаю, он не должен подбирать пробелы, так как метод foundIgnorableWhitespace должен их улавливать, но похоже, что это так. Вот мой код...

   - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{
    //We're at the start of a new data feed
    if([elementName isEqualToString:@"data"])
    {
        if(listOfTimes != nil)
            [listOfTimes release];

        listOfTimes = [[NSMutableArray alloc] init];
    }

    else if ( [elementName isEqualToString:@"start-valid-time"]) {
        currentElementType = kXMLElementTime;
        return;
    }

    else {
        currentElementType = kXMLElementOther;
    }
 //---------------------------------------------------------------------
 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
    {
       if(currentElementType == kXMLElementTime)
       {
           //We don't want anymore than three times
           if ([listOfTimes count] >= 3) 
               return;

           [listOfTimes addObject:string];
       }       
    }

В основном он хранит три элемента «время» в массиве. Проблема, однако, в том, что он, кажется, собирает пробелы в виде новой строки. Вот распечатка массива в консоли...

Printing description of listOfTimes:
(
    "2010-08-21T22:00:00-05:00",
    "\n      ",
    "2010-08-22T01:00:00-05:00"
)

и вот фрагмент данных XML, которые я обрабатываю...

 <time-layout time-coordinate="local" summarization="none">
      <layout-key>k-p3h-n40-1</layout-key>
      <start-valid-time>2010-08-21T22:00:00-05:00</start-valid-time>
      <start-valid-time>2010-08-22T01:00:00-05:00</start-valid-time>
      <start-valid-time>2010-08-22T04:00:00-05:00</start-valid-time>
      <start-valid-time>2010-08-22T07:00:00-05:00</start-valid-time>
      <start-valid-time>2010-08-22T10:00:00-05:00</start-valid-time>
     .
     .
     .

Я неправильно понимаю, как это работает?

Заранее спасибо за помощь!


person BeachRunnerFred    schedule 22.08.2010    source источник


Ответы (2)


Простое решение — создать метод didEndElement:, в котором вы устанавливаете currentElement на kXMLElementOther.

Хорошее описание Ignorable White Space есть на странице Игнорируемое пустое пространство. Проблема, вероятно, в том, что у вас нет DTD, связанного с вашим документом. Таким образом, синтаксический анализатор на самом деле не знает, что такое игнорируемое пустое пространство. (Это не просто пробел между тегами, как вы, вероятно, думаете) Таким образом, все просто обрабатывается как символьные данные.

person Stefan Arentz    schedule 22.08.2010

Я нашел ответ на ваш вопрос, отредактируйте следующий фрагмент кода.

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

Добавьте эту строку кода

NSString *stringToDisplay = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

Теперь ответьте, где вы найдете «строку» в своей функции, упомянутой выше, с помощью «stringToDisplay».

Это сработало для меня. Надеюсь, это сработает и для вас. Наслаждайтесь кодированием.

person Ankit Jain    schedule 25.09.2012