的NSXMLParser“foundCharacters”委托方法
我在解析XML的问题,所以我通过我的代码去与NSLogs,发现 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
不叫。的NSXMLParser“foundCharacters”委托方法
我的XML:
<?xml version="1.0"?>
<locations>
<location>
<name>Americas</name>
<address></address>
<gid>CoQBdAAAAE2tdzw4RGvnvaUZTk6N1ByNtosmD--ZYfcmkkPkR6R6v_nN9gJCO1INOVg-S5rzy7BATEUmvAQzh8hClafZbph2wSgfD28gXNJAttXLUbqzQMaql3rVbisSUv2a2r_H6ktOSaI5lLvf0GNthT5jn2JfAdD_HfUls6qhMvrm5e5XEhDcF5uRjlfpSqI_aciS_QPaGhQVVHenbOKZBQMSoCzsoIsdfw313Q</gid>
<type>
<1>political</1><2/><3/><4/><5/>
</type>
<phone></phone>
<rating></rating>
<icon>http://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png</icon>
<website></website>
<longitude>-105.2551187</longitude>
<latitude>54.5259614</latitude>
</location>
</locations>
我实现
- (void)viewDidLoad
{
[super viewDidLoad];
...
if(!self.distance){self.distance = @"250000";}
NSString *string = [NSString stringWithFormat:@"http://fishbe.in/lab/reserverr/api/?term=%@&lat=%f&long=%f&limit=100&distance=%@", self.searchterm, location.coordinate.latitude, location.coordinate.longitude, self.distance];
NSLog(@"%@", string);
NSURL *URL = [NSURL URLWithString:string];
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
[parser setDelegate:self];
[parser setShouldResolveExternalEntities:NO];
[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[parser parse];
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
self.element = elementName;
if ([self.element isEqualToString:@"locations"]) {
self.items = [[NSMutableArray alloc] init];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
NSLog(@"HI"); //Not outputted
if ([self.element isEqualToString:@"name"]) {
self.result = [[ReserverrSearchResult alloc] init];
[self.result setTitle:string];
NSLog(@"%@", string);
} else if ([self.element isEqualToString:@"address"]) {
[self.result setVicinity:string];
NSLog(@"%@", string);
} else if ([self.element isEqualToString:@"gid"]) {
[self.result setGid:string];
NSLog(@"%@", string);
} else if ([self.element isEqualToString:@"latitude"]) {
[self.result setLatitude:[string floatValue]];
NSLog(@"%@", string);
} else if ([self.element isEqualToString:@"longitude"]) {
[self.result setLongitude:[string floatValue]];
NSLog(@"%@", string);
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"location"]) {
[self.items addObject:self.result];
}
}
- (void)parserDidEndDocument:(NSXMLParser *)parser {
[self addAnnotations];
}
编辑的相关部分 - 增加
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
NSLog(@"%@",parseError);
}
,并没有什么。
有几个问题:
至于韦恩指出,应实现
parser:parseErrorOccurred:
,它会告诉你什么是错的。-
如果
searchterm
包含URL的保留字符(例如空格,加号,和号等)的任何字符,我会期待问题。你应该总是百分号逃避什么,我相信是一个用户提供的搜索项,将其添加到URL:NSString *string = [NSString stringWithFormat:@"http://fishbe.in/lab/reserverr/api/?term=%@&lat=%f&long=%f&limit=100&distance=%@", [self percentEscapeString:self.searchterm], location.coordinate.latitude, location.coordinate.longitude, self.distance];
在那里你可以使用的方法如下所示:
- (NSString *)percentEscapeString:(NSString *)string { NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, (CFStringRef)@" ", (CFStringRef)@":/[email protected]!$&'()*+,;=", kCFStringEncodingUTF8)); return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"]; }
注意,不要依靠
stringByAddingPercentEscapesUsingEncoding
做百分比转义。你真的想要使用CFURLCreateStringByAddingPercentEscapes
,就像上面一样。 -
另一方面,您的XML格式不正确。我不相信
NSXMLParser
会接受数字的元素名称。所以,与其:<type> <1>political</1><2/><3/><4/><5/> </type>
你可能想:
<types> <type>political</type> <type></type> <type></type> <type></type> <type></type> </types>
或者,如果你真的需要那些数字标识符:
<types> <type id="1">political</type> <type id="2"></type> <type id="3"></type> <type id="4"></type> <type id="5"></type> </types>
在后者的例子中,你
didStartElement
可以再使用attributeDict
来提取id
标识符。 -
您报告
parseErrorOccurred
没有返回任何内容。这意味着你的服务器可能没有任何回报。这可能是由许多问题造成的。尝试使用您的URL并返回数据(例如,输入NSString
或NSData
,而不是解析器)并查看响应的样子。例如,用于测试目的,你可以这样做:NSError *error; NSData *data = [NSData dataWithContentsOfURL:url options:0 error:&error]; NSString *results = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; // confirm error is `nil` and `results` is well-formed XML; // you can then pass the `data` to `NSXMLParser` with `initWithData` if you want
我敢打赌那是空的(这对于某些搜索字词可能因缺乏%的转义原因引起,或从任何的服务器很多问题的)。
这可能不是一个问题,但值得注意的是,这是概念上的风险,以将结果保存到
foundCharacters
,因为有时didStartElement
和didEndElement
之间,你必须多次调用foundCharacters
检索数据。通常人们会在didStartElement
中实例化一个NSMutableString
,将其附加到foundCharacters
中,然后将其保存在didEndElement
中。
谢谢!除了现在我收到错误:'2014-02-14 13:16:41.949 Reserverr [940:70b] Error Domain = NSXMLParserErrorDomain Code = 68“操作无法完成。(NSXMLParserErrorDomain error 68.)在解析“gid”元素后,“UserInfo = 0x9d7d3a0 {NSXMLParserErrorLineNumber = 2,NSXMLParserErrorColumn = 323,NSXMLParserErrorMessage = StartTag:无效元素名称 }' 。 – Phil
@Phil是的,这是我的第三点,数字元素名称是不允许的。这是不允许的''(等)。因此,我建议相应地更改XML。 – Rob
添加'parser:parseErrorOccurred:'并查看它是否说了什么。 – Wain