2017-01-06 49 views
0

它我的XML文件中,我已經數據通過XML解析試圖分析緯度和經度和註釋,我在我的字典裏已經

<?xml version="1.0" encoding="UTF-8"?> 
<locations> 
    <location id="1"> 
    <title>United Arab Emirates</title> 
    <latitude>23.424076</latitude> 
    <longitude>53.847818</longitude> 
    </location> 
    <location id="2"> 
    <title>Afghanistan</title> 
    <latitude>33.93911</latitude> 
    <longitude>67.709953</longitude> 
    </location> 
    <location id="3"> 
    <title>Australia</title> 
    <latitude>-25.274398</latitude> 
    <longitude>133.775136</longitude> 
    </location> 
    <location id="4"> 
    <title>Bangladesh</title> 
    <latitude>23.684994</latitude> 
    <longitude>90.356331</longitude> 
    </location> 
</locations> 

所有位置========== ===================== 在於其我.m文件我寫的代碼

@implementation ViewController 

- (void)viewDidLoad { 
[super viewDidLoad]; 
[self dataParsing]; 
NSLog(@"%@",locSMutArr); 
[self setUpMapMethod]; 
// Do any additional setup after loading the view, typically from a nib. 
} 

-(void)dataParsing{ 
NSString *strFile=[[NSBundle mainBundle] pathForResource:@"xmlPractise1" ofType:@"xml"]; 
NSData *dataObj=[NSData dataWithContentsOfFile:strFile]; 
NSXMLParser *parseObj=[[NSXMLParser alloc]initWithData:dataObj]; 
parseObj.delegate=self; 
[parseObj parse]; 
} 

- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

#pragma mark - NSXMLParser Delegate 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict{ 
if ([elementName isEqualToString:@"locations"]) { 
    locSMutArr=[[NSMutableArray alloc]init]; 
} 
else if([elementName isEqualToString:@"location"]){ 
    locMutDic=[[NSMutableDictionary alloc]init]; 
} 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 
if (refString==nil) { 
    refString=[[NSMutableString alloc]init]; 
} 
else{ 
    refString=[NSMutableString stringWithFormat:@"%@%@",refString,string]; 
} 

} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName{ 
if ([elementName isEqualToString:@"latitude"] || [elementName isEqualToString:@"longitude"]) { 
    [locMutDic setValue:refString forKey:elementName]; 
} 
else if ([elementName isEqualToString:@"location"]){ 
    [locSMutArr addObject:locMutDic]; 
} 
refString=nil; 

} 
-(void)setUpMapMethod{ 

for (int i=0; i<4; i++) { 
    CLLocationCoordinate2D CLLocObj; 
    CLLocObj.latitude=[locSMutArr indexOfObject:[locMutDic valueForKey:@"latitude"]]; 
    CLLocObj.longitude=[locSMutArr indexOfObject:[locMutDic valueForKey:@"longitude"]]; 
    MKCoordinateRegion viewRegion=MKCoordinateRegionMakeWithDistance(CLLocObj, 100, 100); 
    [_mapOutlet setRegion:viewRegion]; 
    MKPointAnnotation *annotaionObj=[[MKPointAnnotation alloc]init]; 
    [annotaionObj setCoordinate:CLLocObj]; 
    [_mapOutlet addAnnotation:annotaionObj]; 
    } 

} 
@end 

我想使用循環創建CLLocationCoordinate2D對象,用於xml字典中的lat和lon的所有值。 也可以在那裏註釋所有位置。 全部

============================ 它是我的.h文件,我聲明瞭所有的objs。

@interfaceViewController:UIViewController<NSXMLParserDelegate,CLLocationManagerDele gate,MKMapViewDelegate>{ 
    NSMutableArray *locSMutArr; 
    NSMutableDictionary *locMutDic; 
    NSMutableString *refString; 
    NSMutableArray *mutLatArr; 

} 

@property (weak, nonatomic) IBOutlet MKMapView *mapOutlet; 

@end 
+0

產量是我對你的答案有幫助? – Gulliva

回答

0

所以這裏是爲我工作

import "ViewController.h" 


@interface ViewController() 
@property(nonatomic,strong)NSMutableArray *locations; 
@property(nonatomic,strong)NSMutableDictionary *location; 
@property(nonatomic,strong)NSString *openElement; 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    _locations = [[NSMutableArray alloc]init]; 

    [self parseData]; 
    [self logData]; 
    [self setupMap]; 
    // Do any additional setup after loading the view, typically from a nib. 

} 

-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
} 

-(void)logData{ 
    NSLog(@"%@",_locations); 
} 

-(void)parseData{ 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"xml"]; 

    NSData *data = [[NSData alloc]initWithContentsOfFile:path]; 
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data]; 
    parser.delegate = self; 
    [parser parse]; 
} 


- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict{ 
    if([elementName isEqualToString:@"location"]) 
     _location = [[NSMutableDictionary alloc]init]; 
    else if([elementName isEqualToString:@"locations"]) 
     NSLog(@"Start"); 
    else 
     _openElement = elementName; 

} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 
    if(![string containsString:@"\n"]) 
     [_location setObject:string forKey:_openElement]; 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName{ 
    if([elementName isEqualToString:@"location"]) 
     [_locations addObject:_location]; 
} 

- (void)parser:(NSXMLParser *)parser foundAttributeDeclarationWithName:(NSString *)attributeName forElement:(NSString *)elementName type:(nullable NSString *)type defaultValue:(nullable NSString *)defaultValue{ 
    NSLog(@"%@",attributeName); 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

-(void)setupMap{ 
    for(NSMutableDictionary *dict in _locations){ 
     CLLocationCoordinate2D CLLocObj; 
     CLLocObj.latitude=[(NSString*)[dict valueForKey:@"latitude"] floatValue]; 
     CLLocObj.longitude=[(NSString*)[dict valueForKey:@"longitude"] floatValue]; 
     MKCoordinateRegion viewRegion=MKCoordinateRegionMakeWithDistance(CLLocObj, 100000, 100000); 
     [_mapView setRegion:viewRegion]; 
     MKPointAnnotation *annotaionObj=[[MKPointAnnotation alloc]init]; 
     [annotaionObj setCoordinate:CLLocObj]; 
     [annotaionObj setTitle:[dict valueForKey:@"title"]]; 
     [_mapView addAnnotation:annotaionObj]; 

    } 
} 

這個代碼是我的NSMutableArray與的NSMutableDictionary

(
     { 
     latitude = "23.424076"; 
     longitude = "53.847818"; 
     title = "United Arab Emirates"; 
    }, 
     { 
     latitude = "33.93911"; 
     longitude = "67.709953"; 
     title = Afghanistan; 
    }, 
     { 
     latitude = "-25.274398"; 
     longitude = "133.775136"; 
     title = Australia; 
    }, 
     { 
     latitude = "23.684994"; 
     longitude = "90.356331"; 
     title = Bangladesh; 
    } 
)