iphone XML解析的基本流程
2011-04-11 10:04
435 查看
解析 web Service 的XML内容一直是一个难点,很多开发者在这一部分都十分的费力。下面我就我自己写的一个XML的例子来从头到尾的讲一遍其相关的内容。
在很多的情况下,一个服务是通过某种网络API暴露的,它规定客户端发送什么,服务会在响应里发送什么,一般的来说大部分都返回xml格式的数据。
我们来一个拿个接口实例来说一下: http://data.3g.sina.com.cn/api/index.php?page=1&test=1&wm=b100&cid=43
这个一个网络请求地址,当网web Sevice发送这样的一个请求的时候返回的是这样的一个xml的数据:
上面的代码是connection的代理方法,很容易的看出来twitterData里就是我们取得的XML数据,就是我们后面要解析的东西。[
self
startTwitterParser]
这个方法被调用就是要正式的解析XML数据了,如下:
//开始对返回的
data进行解析
————
-(void
)startTwitterParser
{
NSXMLParser *parser =[[
NSXMLParser alloc
]
initWithData
:
twitterData
];
parser.delegate
= self
;
[parser parse
];
[parser release
];
}
然后就是难点了-如何解析出你想要的内容。
#pragma mark NSXMLParserDelegate--->
- (void
)parserDidStartDocument:(NSXMLParser
*)parser
{
twitterDic
= [[
NSMutableDictionary
alloc]
initWithCapacity:
0
];
//
每一条信息都用字典来存;
parserObjects
= [[
NSMutableArray
alloc
]
init
];
//每一组信息都用数组来存,做后得到的数据就在这个数组中
}
- (void
)parser:(NSXMLParser
*)parser didStartElement:(NSString
*)elementName namespaceURI:(NSString
*)namespaceURI qualifiedName:(NSString
*)qName attributes:(NSDictionary
*)attributeDict
{
if
([elementName isEqualToString
:@"item"
]) //
找节点进行解析
{
NSMutableDictionary *newNode = [[
NSMutableDictionary alloc
]
initWithCapacity
:
0
];
[parserObjects
addObject
:newNode];
twitterDic
= newNode;
}
else
if
(
twitterDic)
{
if
([elementName isEqualToString
:@"enclosure"
])
{
//NSLog(@"%@",attributeDict);//存到字典下了
if
([[attributeDict valueForKey
:@"url"
] hasSuffix
:@"jpg"
]) //
把
encolsuer
下的节点放在字典中
{
[twitterDic
setObject
:[attributeDict valueForKey
:@"url"
] forKey
:@"image"
];
}
else
{
[twitterDic
setObject
:[attributeDict valueForKey
:@"url"
] forKey
:@"video"
];
}
}
else
{
NSMutableString *string = [[
NSMutableString alloc
]
initWithCapacity
:
0
];
[twitterDic
setObject
:string forKey
:elementName];
[string release
];
currentText
= [[NSString
alloc
] init
];
currentElementName
= elementName;
}
}
}
- (void
)parser:(NSXMLParser
*)parser foundCharacters:(NSString
*)string
{
currentText
= [[
NSString
alloc]
initWithString:string];
}
- (void
)parser:(NSXMLParser
*)parser didEndElement:(NSString
*)elementName namespaceURI:(NSString
*)namespaceURI qualifiedName:(NSString
*)qName
{
if
([elementName isEqualToString
:currentElementName
])
{
[
twitterDic setObject
:
currentText forKey
:
currentElementName];
//
把其他节点放在字典中
}
}
-(void
)parserDidEndDocument:(NSXMLParser
*)parser//
得到的解析结果
{
NSLog(
@"%d %@"
,[
parserObjects
count],[[
parserObjects
objectAtIndex:
0
]
valueForKey:
@"title"
]);
}
#pragma mark NSXMLParserDelegate end----->
上面这个些方法都是NSXMLParser的代理方法,分别扮演着不同的角色
首先是 - (void
)parserDidStartDocument:(NSXMLParser
*)parser
这个方法是解析的开始的方法,我在这一步做的就是初始化了数组和字典了---就是以后存储数据的容器。
接着就是第一步的解析:
- (void
)parser:(NSXMLParser
*)parser didStartElement:(NSString
*)elementName namespaceURI:(NSString
*)namespaceURI qualifiedName:(NSString
*)qName attributes:(NSDictionary
*)attributeDict
{
if
([elementName isEqualToString
:@"item"
]) //
找节点进行解析
{
NSMutableDictionary *newNode = [[
NSMutableDictionary
alloc
]
initWithCapacity
:
0
];
[parserObjects
addObject
:newNode];
twitterDic
= newNode;
}
else
if
(
twitterDic)
{
if
([elementName isEqualToString
:@"enclosure"
])
{
//NSLog(@"%@",attributeDict);//存到字典下了
if
([[attributeDict valueForKey
:@"url"
] hasSuffix
:@"jpg"
]) //
把
encolsuer
下的节点放在字典中
{
[twitterDic
setObject
:[attributeDict valueForKey
:@"url"
] forKey
:@"image"
];
}
else
{
[twitterDic
setObject
:[attributeDict valueForKey
:@"url"
] forKey
:@"video"
];
}
}
else
{
NSMutableString *string = [[
NSMutableString
alloc
]
initWithCapacity
:
0
];
[twitterDic
setObject
:string forKey
:elementName];
[string release
];
currentText
= [[NSString
alloc
] init
];
currentElementName
= elementName;
}
}
}
- (void
)parser:(NSXMLParser
*)parser foundCharacters:(NSString
*)string
{
currentText
= [[
NSString
alloc]
initWithString:string];
}
- (void
)parser:(NSXMLParser
*)parser didEndElement:(NSString
*)elementName namespaceURI:(NSString
*)namespaceURI qualifiedName:(NSString
*)qName
{
if
([elementName isEqualToString
:currentElementName
])
{
[
twitterDic
setObject
:
currentText
forKey
:
currentElementName];
//
把其他节点放在字典中
}
}
-(void
)parserDidEndDocument:(NSXMLParser
*)parser//
得到的解析结果
{
NSLog(
@"%d %@"
,[
parserObjects
count],[[
parserObjects
objectAtIndex:
0
]
valueForKey:
@"title"
]);
}
通过分析xml内容的格式来看整个XML
是以<item>为节点的20条信息内容,而且每个<item>节点下有这着不同的信息,其中有个信息
是<enolsure>,它的下面又有几条信息。按照这样的格式分析,写下了以上代码。大家在写代码的时候要根据自己的需求来写的。通过不停
的触发这些代理方法,直到XML被解析完毕,20条信息就存在数组parserObjects里面了,而且每条信息都以字典的形式存在。于是一个我们可以
随时用的内容就生成了,上面最后一个代理方法的输出就是:20 和title下对应的字符串;
大家可以试试!
在很多的情况下,一个服务是通过某种网络API暴露的,它规定客户端发送什么,服务会在响应里发送什么,一般的来说大部分都返回xml格式的数据。
我们来一个拿个接口实例来说一下: http://data.3g.sina.com.cn/api/index.php?page=1&test=1&wm=b100&cid=43
这个一个网络请求地址,当网web Sevice发送这样的一个请求的时候返回的是这样的一个xml的数据:
上面的代码是connection的代理方法,很容易的看出来twitterData里就是我们取得的XML数据,就是我们后面要解析的东西。[
self
startTwitterParser]
这个方法被调用就是要正式的解析XML数据了,如下:
//开始对返回的
data进行解析
————
-(void
)startTwitterParser
{
NSXMLParser *parser =[[
NSXMLParser alloc
]
initWithData
:
twitterData
];
parser.delegate
= self
;
[parser parse
];
[parser release
];
}
然后就是难点了-如何解析出你想要的内容。
#pragma mark NSXMLParserDelegate--->
- (void
)parserDidStartDocument:(NSXMLParser
*)parser
{
twitterDic
= [[
NSMutableDictionary
alloc]
initWithCapacity:
0
];
//
每一条信息都用字典来存;
parserObjects
= [[
NSMutableArray
alloc
]
init
];
//每一组信息都用数组来存,做后得到的数据就在这个数组中
}
- (void
)parser:(NSXMLParser
*)parser didStartElement:(NSString
*)elementName namespaceURI:(NSString
*)namespaceURI qualifiedName:(NSString
*)qName attributes:(NSDictionary
*)attributeDict
{
if
([elementName isEqualToString
:@"item"
]) //
找节点进行解析
{
NSMutableDictionary *newNode = [[
NSMutableDictionary alloc
]
initWithCapacity
:
0
];
[parserObjects
addObject
:newNode];
twitterDic
= newNode;
}
else
if
(
twitterDic)
{
if
([elementName isEqualToString
:@"enclosure"
])
{
//NSLog(@"%@",attributeDict);//存到字典下了
if
([[attributeDict valueForKey
:@"url"
] hasSuffix
:@"jpg"
]) //
把
encolsuer
下的节点放在字典中
{
[twitterDic
setObject
:[attributeDict valueForKey
:@"url"
] forKey
:@"image"
];
}
else
{
[twitterDic
setObject
:[attributeDict valueForKey
:@"url"
] forKey
:@"video"
];
}
}
else
{
NSMutableString *string = [[
NSMutableString alloc
]
initWithCapacity
:
0
];
[twitterDic
setObject
:string forKey
:elementName];
[string release
];
currentText
= [[NSString
alloc
] init
];
currentElementName
= elementName;
}
}
}
- (void
)parser:(NSXMLParser
*)parser foundCharacters:(NSString
*)string
{
currentText
= [[
NSString
alloc]
initWithString:string];
}
- (void
)parser:(NSXMLParser
*)parser didEndElement:(NSString
*)elementName namespaceURI:(NSString
*)namespaceURI qualifiedName:(NSString
*)qName
{
if
([elementName isEqualToString
:currentElementName
])
{
[
twitterDic setObject
:
currentText forKey
:
currentElementName];
//
把其他节点放在字典中
}
}
-(void
)parserDidEndDocument:(NSXMLParser
*)parser//
得到的解析结果
{
NSLog(
@"%d %@"
,[
parserObjects
count],[[
parserObjects
objectAtIndex:
0
]
valueForKey:
@"title"
]);
}
#pragma mark NSXMLParserDelegate end----->
上面这个些方法都是NSXMLParser的代理方法,分别扮演着不同的角色
首先是 - (void
)parserDidStartDocument:(NSXMLParser
*)parser
这个方法是解析的开始的方法,我在这一步做的就是初始化了数组和字典了---就是以后存储数据的容器。
接着就是第一步的解析:
- (void
)parser:(NSXMLParser
*)parser didStartElement:(NSString
*)elementName namespaceURI:(NSString
*)namespaceURI qualifiedName:(NSString
*)qName attributes:(NSDictionary
*)attributeDict
{
if
([elementName isEqualToString
:@"item"
]) //
找节点进行解析
{
NSMutableDictionary *newNode = [[
NSMutableDictionary
alloc
]
initWithCapacity
:
0
];
[parserObjects
addObject
:newNode];
twitterDic
= newNode;
}
else
if
(
twitterDic)
{
if
([elementName isEqualToString
:@"enclosure"
])
{
//NSLog(@"%@",attributeDict);//存到字典下了
if
([[attributeDict valueForKey
:@"url"
] hasSuffix
:@"jpg"
]) //
把
encolsuer
下的节点放在字典中
{
[twitterDic
setObject
:[attributeDict valueForKey
:@"url"
] forKey
:@"image"
];
}
else
{
[twitterDic
setObject
:[attributeDict valueForKey
:@"url"
] forKey
:@"video"
];
}
}
else
{
NSMutableString *string = [[
NSMutableString
alloc
]
initWithCapacity
:
0
];
[twitterDic
setObject
:string forKey
:elementName];
[string release
];
currentText
= [[NSString
alloc
] init
];
currentElementName
= elementName;
}
}
}
- (void
)parser:(NSXMLParser
*)parser foundCharacters:(NSString
*)string
{
currentText
= [[
NSString
alloc]
initWithString:string];
}
- (void
)parser:(NSXMLParser
*)parser didEndElement:(NSString
*)elementName namespaceURI:(NSString
*)namespaceURI qualifiedName:(NSString
*)qName
{
if
([elementName isEqualToString
:currentElementName
])
{
[
twitterDic
setObject
:
currentText
forKey
:
currentElementName];
//
把其他节点放在字典中
}
}
-(void
)parserDidEndDocument:(NSXMLParser
*)parser//
得到的解析结果
{
NSLog(
@"%d %@"
,[
parserObjects
count],[[
parserObjects
objectAtIndex:
0
]
valueForKey:
@"title"
]);
}
通过分析xml内容的格式来看整个XML
是以<item>为节点的20条信息内容,而且每个<item>节点下有这着不同的信息,其中有个信息
是<enolsure>,它的下面又有几条信息。按照这样的格式分析,写下了以上代码。大家在写代码的时候要根据自己的需求来写的。通过不停
的触发这些代理方法,直到XML被解析完毕,20条信息就存在数组parserObjects里面了,而且每条信息都以字典的形式存在。于是一个我们可以
随时用的内容就生成了,上面最后一个代理方法的输出就是:20 和title下对应的字符串;
大家可以试试!
相关文章推荐
- iphone XML解析的基本流程
- iphone XML解析的基本流程
- IPhone之NSXMLParser的使用----xml解析流程小结
- 【引用】iphone xml解析流程
- Iphone开发之xml解析流程小结
- Iphone XML报文解析
- Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(上)
- iPhone开发笔记——webservice解析xml
- Silverlight中XmlReader解析XML的流程
- iphone ios json解析流程,教程
- 12-002-1 XML基本语法与解析
- iphone ios json解析流程,教程
- iOS平台XML解析类库对比概述(iPhone网络篇一)
- springMvc的一些简介 和基于xml的handlerMapping基本流程
- iphone开发之iphone解析xml&json-2
- iphone开发 NSXMLParser解析xml文件
- iPhone开发 解析xml NSData xml
- Hibernate源码解析---------hibernate.cfg.xml读取流程
- 第三篇:dom4j解析XML的基本用法