ios - 如何解析我添加到项目中的 XML 文件

标签 ios objective-c xml-parsing

我做了一个自定义的 NSObject 类,我用它来解析 XML 页面,它是:

#import "requestManager.h"


@implementation requestManager

-(id)initWithDelegate:(id<requestDelegate>)delegateObj{

    self = [super init];
    if (self){
        self.delegate = delegateObj;
        self.contentData = [NSMutableData data];
        self.listOfPlaces = [NSMutableArray array];
    }

    return self;
}


-(void)loadXmlData{


    NSURL *urlStr = [NSURL URLWithString:@"http://www.w3schools.com/xml/simple.xml"];
    NSURLRequest *req = [NSURLRequest requestWithURL:urlStr];


    NSURLConnection *conn = [NSURLConnection connectionWithRequest:req delegate:self];
    [conn start];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

    [self.contentData appendData:data];
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{

    NSXMLParser *parserObj  =[[NSXMLParser alloc] initWithData:self.contentData];
    parserObj.delegate = self;
    [parserObj parse];

    NSLog(@"FINISHLOADING");
    [self.delegate didFinishParsingToDatabase:self.listOfPlaces];

}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{

    NSLog(@"error!");
}


-(void)parser:(NSXMLParser*)parser foundCharacters:(NSString *)string{


    if (isName) [self.currentPosition setValue:string forKey:@"name"];
    if (isDescription) [self.currentPosition setValue:string forKey:@"description"];
    if (isLatitude) [self.currentPosition setValue:string forKey:@"latitude"];
    if (isLongitude) [self.currentPosition setValue:string forKey:@"longitude"];;
    if (isWebPage) [self.currentPosition setValue:string forKey:@"webPage"];
    if (isImageCell) [self.currentPosition setValue:string forKey:@"imageCell"];
    if (isImageFirst) [self.currentPosition setValue:string forKey:@"imageFirst"];
    if (isImageSecond) [self.currentPosition setValue:string forKey:@"imageSecond"];
    if (isImageThird) [self.currentPosition setValue:string forKey:@"imageThird"];
    if (isImageFourth) [self.currentPosition setValue:string forKey:@"imageFourth"];


}

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{

    if ([elementName isEqualToString:@"place"]){
        self.currentPosition = [NSMutableDictionary dictionary];
    }

    if ([elementName isEqualToString:@"name"]) isName = YES;
    if ([elementName isEqualToString:@"description"]) isDescription = YES;
    if ([elementName isEqualToString:@"latitude"]) isLatitude = YES;
    if ([elementName isEqualToString:@"longitude"]) isLongitude = YES;
    if ([elementName isEqualToString:@"imageCell"]) isImageCell = YES;
    if ([elementName isEqualToString:@"imageSecond"]) isImageSecond = YES;
    if ([elementName isEqualToString:@"imageThird"]) isImageThird = YES;
    if ([elementName isEqualToString:@"imageFourth"]) isImageFourth = YES;
    if ([elementName isEqualToString:@"webpage"]) isWebPage = YES;

}


-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{



    if ([elementName isEqualToString:@"name"]) isName = NO;
    if ([elementName isEqualToString:@"description"]) isDescription = NO;
    if ([elementName isEqualToString:@"latitude"]) isLatitude = NO;
    if ([elementName isEqualToString:@"longitude"]) isLongitude = NO;
    if ([elementName isEqualToString:@"imageCell"]) isImageCell = NO;
    if ([elementName isEqualToString:@"imageSecond"]) isImageSecond = NO;
    if ([elementName isEqualToString:@"imageThird"]) isImageThird = NO;
    if ([elementName isEqualToString:@"imageFourth"]) isImageFourth = NO;
    if ([elementName isEqualToString:@"webpage"]) isWebPage = NO;

    if ([elementName isEqualToString:@"place"]){
        //    self.currentPosition = [NSMutableDictionary dictionary];
//        NSLog(@"%@", self.currentPosition);
        [self.listOfPlaces addObject:self.currentPosition];
              NSLog(@"%@", self.listOfPlaces);
    }

}


//-(void)parserDidEndDocument:(NSXMLParser *)parser{
//    
//    
//}


@end

我想要的是将一个 xml 文件添加到我的项目中并离线解析它。我应该如何实现?我应该为它编写另一个类,还是修改现有的?

如有任何建议,我们将不胜感激。

最佳答案

您目前可以下载您的 XML 文件,并解析您的 XML 文件。如果您将这两个函数分开,那么您将能够下载它从您的 Bundle 加载它,然后使用完全相同的代码来解析它。

查看您的 connectionDidFinishLoading 方法。提取那里的方法并将它们放在它们自己的类中,然后调用该类。先让它工作。 (这称为重构。)

接下来您可以从您的 Bundle 打开一个 XML 文件,从中获取 NSData,然后调用您刚刚创建的类。

关于ios - 如何解析我添加到项目中的 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21534348/

相关文章:

iphone - iphone sdk 中电子邮件对话框未打开

ios - 抽屉 TableView : dismiss by pulling down

iphone - 我们如何以编程方式启用/禁用默认的 iPhone 相机?

c# - 解析 boolean C# 文化 verdadero

ios - 将 "shared via iOS"更改为“通过 <AppName> 共享”

java - Firebase:为身份验证和通知设置不同的环境

objective-c - 以编程方式禁用我们应用程序中文档目录的备份

ios - 在核心数据中保存/获取数据不一致

python - 使用 Python 和 ElementTree 在 XML 中搜索变量属性

java - XML 将节点值解析为字符串