XML-файл не анализируется с помощью NSXMLParser в iOS

Я занимаюсь разработкой приложения, которое транслирует радиостанции в приложение. Имена и ссылки радиостанций хранятся в файле XML, который выглядит следующим образом:

<radiostacionet>
<radio>
<emri>Radio Gurbeti</emri>
<frekuenca>N/A</frekuenca>
<linku>http://192.184.9.79:8218</linku>
<image>
http://localhost/Apps/An/Shqipcom/data/source/img/radio/radiogurbeti.png
</image>
<dateandtime>
<day>27</day>
<month>09</month>
<year>2013</year>
<hour>13</hour>
<min>43</min>
<sec>00</sec>
</dateandtime>
<website>http://www.radiogurbeti.com/</website>
</radio>
<radio>
<emri>Radio STAR</emri>
<frekuenca>96.4 FM</frekuenca>
<linku>http://radio.1dhe1.com:9400</linku>
<image>
http://localhost/Apps/An/Shqipcom/data/source/img/radio/radiostargjilani.png
</image>
<dateandtime>
<day>27</day>
<month>09</month>
<year>2013</year>
<hour>13</hour>
<min>42</min>
<sec>02</sec>
</dateandtime>
<website>http://www.radiostargjilan.com/</website>
</radio>
<radio>
<emri>Radio VALA RINORE</emri>
<frekuenca>94.7 Fm</frekuenca>
<linku>http://84.22.46.10:8000/</linku>
<image>
http://localhost/Apps/An/Shqipcom/data/source/img/radio/radiovalarinore.png
</image>
<dateandtime>
<day>27</day>
<month>09</month>
<year>2013</year>
<hour>13</hour>
<min>41</min>
<sec>07</sec>
</dateandtime>
<website>http://www.valarinore.net/</website>
</radio>
<radio>
<emri>Radio Islame</emri>
<frekuenca>N/A</frekuenca>
<linku>http://server5.digital-webstream.de:33725</linku>
<image>
http://localhost/Apps/An/Shqipcom/data/source/img/radio/radioislame.png
</image>
<dateandtime>
<day>27</day>
<month>09</month>
<year>2013</year>
<hour>13</hour>
<min>35</min>
<sec>13</sec>
</dateandtime>
<website>http://www.radiovizioni.net/</website>
</radio>
<radio>
<emri>Radio Vizioni</emri>
<frekuenca>88.1 FM</frekuenca>
<linku>http://www.vera-ks.com:9222/</linku>
<image>
http://localhost/Apps/An/Shqipcom/data/source/img/radio/radiovizioni.png
</image>
<dateandtime>
<day>27</day>
<month>09</month>
<year>2013</year>
<hour>13</hour>
<min>34</min>
<sec>35</sec>
</dateandtime>
<website>http://www.radiovizioni.net/</website>
</radio>
<radio>
<emri>Radio Zëri Mitrovices</emri>
<frekuenca>N/A</frekuenca>
<linku>http://209.105.250.73:8202/</linku>
<image>
http://localhost/Apps/An/Shqipcom/data/source/img/radio/radiomitrovica.png
</image>
<dateandtime>
<day>27</day>
<month>09</month>
<year>2013</year>
<hour>13</hour>
<min>33</min>
<sec>40</sec>
</dateandtime>
<website>http://radiomitrovica.eu/</website>
</radio>
<radio>
<emri>Radio Ferizaj</emri>
<frekuenca>N/A</frekuenca>
<linku>http://87.106.23.138:2012</linku>
<image>
http://localhost/Apps/An/Shqipcom/data/source/img/radio/radioferiziaj.png
</image>
<dateandtime>
<day>27</day>
<month>09</month>
<year>2013</year>
<hour>13</hour>
<min>32</min>
<sec>52</sec>
</dateandtime>
<website>http://www.radioferizaji.net/</website>
</radio>
<radio>
<emri>Radio Gjakova</emri>
<frekuenca>N/A</frekuenca>
<linku>http://82.114.80.202:8000/</linku>
<image>
http://localhost/Apps/An/Shqipcom/data/source/img/radio/radiogjakova.png
</image>
<dateandtime>
<day>27</day>
<month>09</month>
<year>2013</year>
<hour>13</hour>
<min>31</min>
<sec>45</sec>
</dateandtime>
<website>http://www.radiogjakova.info/</website>
</radio>
<radio>
<emri>Radio Marimanga</emri>
<frekuenca>N/A</frekuenca>
<linku>http://91.82.85.71:9084/</linku>
<image>
http://localhost/Apps/An/Shqipcom/data/source/img/radio/radiomarimanga.png
</image>
<dateandtime>
<day>27</day>
<month>09</month>
<year>2013</year>
<hour>13</hour>
<min>30</min>
<sec>59</sec>
</dateandtime>
<website>http://www.radiomarimanga.com/</website>
</radio>
<radio>
<emri>Radio Kosova e Lire</emri>
<frekuenca>N/A</frekuenca>
<linku>http://www.radiokosovaelire.com/</linku>
<image>
http://localhost/Apps/An/Shqipcom/data/source/img/radio/radiokosovaelire.png
</image>
<dateandtime>
<day>27</day>
<month>09</month>
<year>2013</year>
<hour>13</hour>
<min>30</min>
<sec>05</sec>
</dateandtime>
<website>http://www.radiokosovaelire.com/</website>
</radio>
<radio>
<emri>Radio Love</emri>
<frekuenca>N/A</frekuenca>
<linku>http://91.121.23.6:8030</linku>
<image>
http://localhost/Apps/An/Shqipcom/data/source/img/radio/radiolove.png
</image>
<dateandtime>
<day>27</day>
<month>09</month>
<year>2013</year>
<hour>13</hour>
<min>29</min>
<sec>34</sec>
</dateandtime>
<website>http://dukagjini.com</website>
</radio>
<radio>
<emri>Radio Shqip</emri>
<frekuenca>N/A</frekuenca>
<linku>http://91.121.23.6:8020</linku>
<image>
http://localhost/Apps/An/Shqipcom/data/source/img/radio/radioshqip.png
</image>
<dateandtime>
<day>27</day>
<month>09</month>
<year>2013</year>
<hour>13</hour>
<min>29</min>
<sec>12</sec>
</dateandtime>
<website>http://dukagjini.com</website>
</radio>
<radio>
<emri>Radio HIT</emri>
<frekuenca>N/A</frekuenca>
<linku>http://91.121.23.6:8010</linku>
<image>
http://localhost/Apps/An/Shqipcom/data/source/img/radio/radiohit.png
</image>
<dateandtime>
<day>27</day>
<month>09</month>
<year>2013</year>
<hour>13</hour>
<min>27</min>
<sec>56</sec>
</dateandtime>
<website>http://dukagjini.com</website>
</radio>
<radio>
<emri>Radio Kosova</emri>
<frekuenca>99.99</frekuenca>
<linku>http://stream2.rtkit.com:8088</linku>
<image>
http://localhost/Apps/An/Shqipcom/data/source/img/radio/3_rating_not_important.png
</image>
<dateandtime>
<day>27</day>
<month>09</month>
<year>2013</year>
<hour>10</hour>
<min>48</min>
<sec>34</sec>
</dateandtime>
<website>rtklive.com</website>
</radio>
<radio>
<emri>Radio dukagjini</emri>
<frekuenca>99.6</frekuenca>
<linku>http://s1.voscast.com:8226</linku>
<image>
http://localhost/Apps/An/Shqipcom/data/source/img/radio/3_rating_important.png
</image>
<dateandtime>
<day>26</day>
<month>09</month>
<year>2013</year>
<hour>16</hour>
<min>52</min>
<sec>01</sec>
</dateandtime>
<website>google.com</website>
</radio>
<radio>
<emri>Radio Bluesky</emri>
<frekuenca>101.2</frekuenca>
<linku>http://stream2.rtkit.com:8098</linku>
<image>
http://localhost/Apps/An/Shqipcom/data/source/img/radio/cio_feed_logo.png
</image>
<dateandtime>
<day>26</day>
<month>09</month>
<year>2013</year>
<hour>11</hour>
<min>25</min>
<sec>22</sec>
</dateandtime>
<website>example.com</website>
</radio>
</radiostacionet>

Я использую NSXMLParser для анализа XML и хочу извлечь имя и ссылку из документа (emri и linku).

В моем файле RadioViewController.h я объявил следующие переменные:

@interface RadioViewController : UIViewController <NSXMLParserDelegate>

{
    NSMutableArray *_idName;
    NSMutableArray *_idLink;
    BOOL isRadio;
}

В файле RadioViewConrtoller.m я написал следующий код:

- (void)viewDidLoad
{
    [super viewDidLoad];

    _idName = [[NSMutableArray alloc] init];
    _idLink = [[NSMutableArray alloc] init];

    NSURL *URL = [NSURL URLWithString:@"my_link"];
    NSXMLParser * parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
    [parser setDelegate:self];
    [parser parse];
}

И наконец методы парсера:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{

    if ([elementName isEqualToString:@"radio"]) {
        isRadio = YES;
    }
    else if ([elementName isEqualToString:@"radio"] && isRadio){
        NSString *idString = [attributeDict objectForKey:@"emri"];
        NSString *isbnString = [attributeDict objectForKey:@"linku"];
        [_idName addObject:idString];
        [_idLink addObject:isbnString];
        NSLog(@"Radio id is: %@ and Link is: %@",idString,isbnString);
    }
}

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

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

    if ([elementName isEqualToString:@"emri"]) {
        isRadio=NO;
        NSLog(@"Id Array count is :%d",[_idName count]);
    }
}

Нет, проблема в том, что когда я запускаю приложение, я получаю следующее сообщение в журнале:

Любая помощь будет принята с благодарностью, потому что я не вижу, что я могу делать здесь не так.

Большое спасибо.

Granit

2 ответа

Решение

Опечатка!

if ([elementName isEqualToString:@"radio"] && isRadio){

Должно быть:

if ([elementName isEqualToString:@"emri"] && isRadio){
//                                 ^^^^

Также isRadio должно быть inRadio, чтобы быть более информативным.

В вашем коде условие else if в методе didStartElement не будет выполнено. Потому что вы уже проверяете, что имя элемента является радио в условии if. Таким образом, ваше условие if содержит элементы, не относящиеся к радио. Таким образом, объекты не добавляются в массив. Измените код как

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{

    if ([elementName isEqualToString:@"radio"] && isRadio) {
        NSString *idString = [attributeDict objectForKey:@"emri"];
        NSString *isbnString = [attributeDict objectForKey:@"linku"];
        [_idName addObject:idString];
        [_idLink addObject:isbnString];
        NSLog(@"Radio id is: %@ and Link is: %@",idString,isbnString);

    }
    else if ([elementName isEqualToString:@"radio"] && !isRadio){
       isRadio = YES;
    }
}
Другие вопросы по тегам