iOS學(xué)習(xí)之路 XML處理
iOS學(xué)習(xí)之路 XML處理是本文要介紹的內(nèi)容,主要介紹了XML文件的操作,具體詳細(xì)內(nèi)容我們看內(nèi)容。不多說,直接進(jìn)入話題。
解析不是utf-8的xml文件(尤其是中文網(wǎng)站的rss文件):
如果url中有中文:
- view plaincopy to clipboardprint?const char *str = [searchURL UTF8String];
- NSString *url = [NSString stringWithUTF8String:str];
- url = [url stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
- NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
- const char *str = [searchURL UTF8String];
- NSString *url = [NSString stringWithUTF8String:str];
- url = [url stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
- NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
gbk編碼的xml文件:
- NSString *xmlStr = [[NSString alloc] initWithData:inData encoding:0x80000632];
- NSString *newXMLStr = [xmlStr stringByReplacingOccurrencesOfString:@"encoding=/"gbk/"" withString:@"encoding=/"UTF-8/""];
- NSXMLParser *nextParser = [[NSXMLParser alloc] initWithData:[newXMLStr dataUsingEncoding:NSUTF8StringEncoding]];
- NSString *xmlStr = [[NSString alloc] initWithData:inData encoding:0x80000632];
- NSString *newXMLStr = [xmlStr stringByReplacingOccurrencesOfString:@"encoding=/"gbk/"" withString:@"encoding=/"UTF-8/""];
- NSXMLParser *nextParser = [[NSXMLParser alloc] initWithData:[newXMLStr dataUsingEncoding:NSUTF8StringEncoding]];
在iOS中解析XML
以讀文件的形式
iOS中的XML是event-driven模式
1:打開一個(gè)xml文件,讀取內(nèi)容到NSData中
2:調(diào)用NSXMLParse的nitWithData方法,并設(shè)置代理tweetParser.delegate = self;
3:調(diào)用回調(diào)函數(shù)
注意:xml文件的第一個(gè)tag必須要頂格寫!
- <?xml version="1.0" encoding="UTF-8"?>
- <bookstore>
- <book catalog="Programming">
- <title lang="en">C++ Programming Language</title>
- <author>Bjarne Stroustrup</author>
- <year>1998</year>
- <price>98.0</price>
- </book>
- <book catalog="Networking">
- <title lang="en">TCP/IP Illustrated</title>
- <author>Richard Stevens</author>
- <year>1996</year>
- <price>56.0</price>
- </book>
- </bookstore>
- <?xml version="1.0" encoding="UTF-8"?>
- <bookstore>
- <book catalog="Programming">
- <title lang="en">C++ Programming Language</title>
- <author>Bjarne Stroustrup</author>
- <year>1998</year>
- <price>98.0</price>
- </book>
- <book catalog="Networking">
- <title lang="en">TCP/IP Illustrated</title>
- <author>Richard Stevens</author>
- <year>1996</year>
- <price>56.0</price>
- </book>
- </bookstore>
可以[NSXMLParser parserError]調(diào)用來得到錯(cuò)誤的信息:
- NSXMLParserErrorDomain error 4: xml文件格式有問題(如上面)
- NSXMLParserErrorDomain error 5: 打開文件失敗
在iOS 4.1中如果不顯示實(shí)現(xiàn)NSXMLParseDelegate的話會(huì)有一條warning的提示,但是實(shí)行是沒有問題的。
- //開始解析前,可以做一些初始話的工作
- - (void)parserDidStartDocument:(NSXMLParser *)parser {
- }
- - (void)parserDidStartDocument:(NSXMLParser *)parser {
- }
- //解析到一個(gè)開始tag,開始tag中可能會(huì)有properpies,例如<book catalog="Programming">
- //所有的屬性都儲(chǔ)存在attributeDict中
- - (void)parser:(NSXMLParser *)parser
- didStartElement:(NSString *)elementName
- namespaceURI:(NSString *)namespaceURI
- qualifiedName:(NSString *)qualifiedName
- attributes:(NSDictionary *)attributeDict {
- if ([elementName isEqual:@"book"]) {
- NSString *catalog = [attributeDict objectForKey:@"catalog"];
- }
- else if([bookTags containsObject:elementName]){
- }
- }
- - (void)parser:(NSXMLParser *)parser
- didStartElement:(NSString *)elementName
- namespaceURI:(NSString *)namespaceURI
- qualifiedName:(NSString *)qualifiedName
- attributes:(NSDictionary *)attributeDict {
- if ([elementName isEqual:@"book"]) {
- NSString *catalog = [attributeDict objectForKey:@"catalog"];
- }
- else if([bookTags containsObject:elementName]){
- }
- }
- //這時(shí)處理例如<title lang="en">C++ Programming Language</title>的情況
- - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
- }
- - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
- }
- //處理到一個(gè)結(jié)束tag
- - (void)parser:(NSXMLParser *)parser
- didEndElement:(NSString *)elementName
- namespaceURI:(NSString *)namespaceURI
- qualifiedName:(NSString *)qName {
- }
- - (void)parser:(NSXMLParser *)parser
- didEndElement:(NSString *)elementName
- namespaceURI:(NSString *)namespaceURI
- qualifiedName:(NSString *)qName {
- }
- //xml解析結(jié)束
- - (void)parserDidEndDocument:(NSXMLParser *)parser {
- }
- - (void)parserDidEndDocument:(NSXMLParser *)parser {
- }
- //例子,這里要特別注意的是dataWithContentsOfFile后面一定要根絕對(duì)路徑,而NSBundle能根據(jù)文件名來得到這個(gè)絕對(duì)路徑。
- -(void) testXMLParse{
- NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"test.xml" ofType:nil inDirectory:nil];
- NSData *fileData = [NSData dataWithContentsOfFile:xmlPath];
- NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:fileData];
- [xmlParser setDelegate:self];
- BOOL result = [xmlParser parse];
- if (!result) {
- NSLog(@"The error is %@", [xmlParser parserError]);
- }
- //[xmlParser release];
- }
小結(jié):iOS學(xué)習(xí)之路 XML處理的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!