Почему NSXMLParser выбирает этот пробел в методе foundCharacters? - PullRequest
7 голосов
/ 22 августа 2010

Я учусь использовать 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>
     .
     .
     .

Не понимаю ли я, как этоработает?

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

Ответы [ 3 ]

6 голосов
/ 22 августа 2010

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

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

3 голосов
/ 21 февраля 2013
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    //whatever data i am getting from node i am appending it to the nodecontent variable
    [nodecontent appendString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
    NSLog(@"node content = %@",nodecontent);
}
2 голосов
/ 25 сентября 2012

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

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

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

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

Теперь отвечайте везде, где вы найдете "string" в вашей функции, упомянутой выше, с "stringToDisplay"

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

...