iOS中的XML解析问题

时间:2013-11-25 05:40:37

标签: ios xml nsxmlparser

我一直试图解析下面的XML而没有任何成功。 这是XML数据: -

 <latitude>51.50998000</latitude> <longitude>-0.13370000</longitude>

我将此数据转换为NSData,然后解析它。 以下是NSData形式的外观: -

presence converted to NSData :- <3c6c6174 69747564 653e3531 2e353039 39383030 303c2f6c 61746974 7564653e 203c6c6f 6e676974 7564653e 2d302e31 33333730 3030303c 2f6c6f6e 67697475 64653e>

这就是我实际解析数据的方式: -

 -(LocationParser *)initXMLParser:(NSData *)dataWithlocation
{
    self=[super init];
    if (self){
    self.receivedData = dataWithlocation;
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:self.receivedData];
    [parser setDelegate:self];
    BOOL success=[parser parse];
    if (success) {
        NSLog(@"Successful Parsing");

    }
    else{
        NSLog(@"Error while parsing");
    }
}
return self;
}

 -(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName      namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
 {
   if ([elementName isEqualToString:@"latitude"])
 {
   _location = [[Location alloc]init];

    //Extract the attribute here
    _location.latitude =[[attributeDict objectForKey:@"latitude"]stringValue];
    NSLog(@"latitude is :- %@", _location.latitude);  // this shows latitude is :- (null)
    _location.longitude = [[attributeDict objectForKey:@"longitude"]stringValue];
     NSLog(@"longitude is :- %@", _location.longitude); // this shows  longitude is :- (null)

  }
 }

   - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
   {
    if(!_curElem)
    _curElem = [[NSMutableString alloc] initWithString:string];
  else
    [_curElem appendString:string];

  NSLog(@"Processing Value: %@", _curElem);  //This shows Processing Value: 51.50998000

}


    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
   namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
   {
     if ([elementName isEqualToString:@"latitude"])
   {
    return;

   }
    else
   {
    [_location setValue:_curElem forKey:elementName];

    _curElem = nil;
}
}

2 个答案:

答案 0 :(得分:1)

属性是开始和结束括号之间的事物。

<longitude attribute="more info">8.19283</longitude>

您无法在attributeDict中找到实际值。在parser:foundCharacters:

中解析经度/纬度值

编辑:由于纬度是XML中的第一个,因此也会先解析它。 要确定某个值是否为初始值,您应该使用一些无效值在您的位置类中初始化您的位置。

编辑2 :确保您拥有有效的XML。 NSXMLParser期待ONE!围绕两者之间的所有元素。它认为您的XML文件在</latitude>之后结束了。

<location>
    <latitude>50.0984321</latitude>
    <longitude>-0.13370000</longitude>
</location>

以下是我现在实施和测试的来源

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    if ([elementName isEqualToString:@"latitude"]) {
        self.location = [[Location alloc] init];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    if (self.location.isLatitudeInitial) {
        self.location.latitude = string.doubleValue;
    } else {
        self.location.longitude = string.doubleValue;
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    if ([elementName isEqualToString:@"longitude"]) {
        NSLog(@"%@", self.location);
    }
}

在位置类

#define INITIAL 9999.0

@implementation Location

- (id)init {
    self = [super init];
    if (self) {
        self.latitude = INITIAL;
        self.longitude = INITIAL;
    }
    return self;
}

- (BOOL)isLatitudeInitial {
    return self.latitude == INITIAL;
}

- (NSString *)description {
    return [NSString stringWithFormat:@"Latitude: %f, longitude: %f", self.latitude, self.longitude];
}

@end

完美运作

答案 1 :(得分:0)

您是否尝试过使用AFNetworking框架? 您可以在此处找到示例http://www.raywenderlich.com/30445/afnetworking-crash-course