在iOS中使用NSXMLParser无法解析XML文件
我正在开发一个应用程序,将电台流式传输到应用程序。广播电台名称和链接都存储在看起来像一个XML文件中的以下内容:在iOS中使用NSXMLParser无法解析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]);
}
}
没问题是当我运行应用程序时,我得到以下日志messa ge:
任何帮助将不胜感激,因为我不明白我在这里可能会做错什么。
非常感谢。
Granit
错字!
if ([elementName isEqualToString:@"radio"] && isRadio){
应该是:
if ([elementName isEqualToString:@"emri"] && isRadio){
// ^^^^
而且isRadio
确实应该inRadio
,更描述。
课程OP:命名是你的朋友!也总是使用常量的名字! –
当我将“radio”更改为“emri”后,该应用程序崩溃并显示以下错误:2013-09-30 10:45:31.867 ShqipCom [714:c07] ***由于未捕获的异常'NSInvalidArgumentException',原因:'终止应用程序' *** - [__ NSArrayM insertObject:atIndex:]:object can not be nil' – Granit
@Grangji这是因为'linku'标签不会被解析器看到。您需要将该标记的处理移动到它自己的“代码段”中。 – trojanfoe
在你的代码中,否则,如果在didStartElement方法状态也不executed.because你已经检查的元素名称是无线电在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;
}
}
调试不是火箭科学。有时(如果不是全部的话)它可以挽救你的生命。调试你的代码,你会看到出了什么问题。你的'if语句'是错误的。没有机会到达'else'部分 – OutOfBoundsException