Я учусь использовать API-интерфейс NSXMLParser
для платформы 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>
.
.
.
Неужели я неправильно понимаю, как это работает?
Заранее спасибо за вашу помощь!
Простым решением является создание метода didEndElement:
, в котором вы задаете для currentElement
значение kXMLElementOther
.
Есть хорошее описание Ignorable White Space
в Ignorable White Space. Проблема, вероятно, в том, что у вас нет DTD, связанного с вашим документом. Таким образом, синтаксический анализатор на самом деле не знает, что такое игнорируемое пустое пространство. (Это не просто пробел между тегами, как вы, вероятно, думаете) Таким образом, все просто обрабатывается как символьные данные.