эй, ребята, у меня вопрос с разбором xml. Как правило, стиль файла XML, как это:Парсер XML с NSXMLParser
<person>
<name> abc </name>
<age> 19 </age>
<gender> male </gender>
</person>
Таким образом, мы используем
elementName isEqualToString:@"name"
elementName isEqualToString:@"age"
elementName isEqualToString:@"gender"
для идентификации элемента.
Теперь я столкнулся стиль файла XML, как:
<person>
<element type="name">abc</element>
<element type="age">19</element>
<element type="gender">male</element>
</person>
В этой ситуации, мы не можем использовать
elementName isEqualToString:@"name"
Так что я пытался использовать
if ([elementName isEqualToString:@"element"]) {
if ([[attributeDict objectForKey:@"type"] isEqualToString:@"name"){
.....
}
}
, чтобы определить «имя», но это не дало мне никакого значения, нет ничего, если бы я попытался получить значение «имя».
Итак, есть ли у кого-нибудь предложения по устранению этой проблемы? благодаря
PS: Вот часть моего кода
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict {
if ([elementName isEqualToString:@"area"]) {
if ([[attributeDict objectForKey:@"type"] isEqualToString:@"location"]) {
NSString *description = [attributeDict objectForKey:@"description"];
NSArray *lineEntry = [[NSArray alloc] initWithObjects:description,nil ];
NSArray *lineKeys = [[NSArray alloc] initWithObjects:@"description",nil];
NSDictionary *dictItem = [[NSDictionary alloc] initWithObjects:lineEntry forKeys:lineKeys];
[lineKeys release];
[lineEntry release];
[dataLoad addObject:dictItem];
[dictItem release];
}
}
if ([elementName isEqualToString:@"forecast-period"]) {
NSString *index = [attributeDict objectForKey:@"index"];
NSString *time = [attributeDict objectForKey:@"start-time-local"];
NSArray *indexEntry = [[NSArray alloc] initWithObjects:index,time,nil];
NSArray *indexKey = [[NSArray alloc] initWithObjects:@"index",@"start-time-local",nil];
NSDictionary *dicIndex = [[NSDictionary alloc] initWithObjects:indexEntry forKeys:indexKey];
[indexEntry release];
[indexKey release];
[weatherLoad addObject:dicIndex];
[dicIndex release];
}
}
он работал отлично с этими 2-х частей, но это не работает, если я пытаюсь получить «forecast_icon_code», «air_temperature_minimum», «air_temperature_maximum» «конспект».
<forecast-period index="1" start-time-local="2010-11-19T00:00:00+11:00" end-time-local="2010-11-20T00:00:00+11:00" start-time-utc="2010-11-18T13:00:00Z" end-time-utc="2010-11-19T13:00:00Z">
<element type="forecast_icon_code">1</element>
<element type="air_temperature_minimum" units="Celsius">12</element>
<element type="air_temperature_maximum" units="Celsius">24</element>
<text type="precis">Sunny.</text>
</forecast-period>
Любые предложения? BTW, весь xml-файл находится здесь: ftp://ftp2.bom.gov.au/anon/gen/fwo/IDV10753.xml
Вы уверены, что вы используете NSXMLParser? Это SAX-парсер, то есть вы получать обратный вызов каждый раз, когда он попадает в начало/конец элемента и т. д. - API не запрашивает элемент по имени. NSXML больше похож на то, о чем вы говорите. –
Небольшая часть кода, который вы используете отправленный весь код из всех методов делегирования NSXMLParser, которые вы реализуете. – Anna
Да, я использую NSXMLParser. Исходный XML не так прост, им просто путают в этом виде XML style. Нет проблем, если XML-файл не имеет . –
david