gpt4 book ai didi

ios - NSXMLParser "foundCharacters"未调用委托(delegate)方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:36:30 26 4
gpt4 key购买 nike

我在解析 XML 时遇到了问题,所以我使用 NSLogs 检查我的代码并注意到- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string没有被调用。

我的 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);
}

一无所获。

最佳答案

有几个问题:

  1. 正如 wain 指出的那样,您应该实现 parser:parseErrorOccurred:,它会告诉您哪里出了问题。

  2. 如果 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)@":/?@!$&'()*+,;=",
    kCFStringEncodingUTF8));
    return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
    }

    请注意,不要依赖 stringByAddingPercentEscapesUsingEncoding 来进行百分比转义。你真的想像上面那样使用 CFURLCreateStringByAddingPercentEscapes

  3. 顺便说一句,您的 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 标识符。

  4. 您报告 parseErrorOccurred 没有返回任何内容。这意味着您的服务器可能没有返回任何东西。这可能是由许多问题中的任何一个引起的。尝试使用您的 URL 并返回数据(例如,返回到 NSStringNSData,而不是解析器)并查看响应是什么样的。例如,出于测试目的,您可以这样做:

    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

    我敢打赌它是空的(对于某些搜索词来说,这可能是由于缺少百分比转义,或者是由于无数服务器问题中的任何一个造成的)。

  5. 这可能不是问题,但值得注意的是,将结果保存在 foundCharacters 中在概念上是有风险的,因为有时在 didStartElement 之间didEndElement,您将多次调用 foundCharacters 来检索数据。一般人会在didStartElement中实例化一个NSMutableString,在foundCharacters中追加,然后保存在didEndElement中。

关于ios - NSXMLParser "foundCharacters"未调用委托(delegate)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21784007/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com