ios NSXmlparser方法 XML解析
2013-01-21 14:56
411 查看
在网上查了很多这样的资料,都大差不差的简单写了下,今天我也完成了一份,内容被我简化了,主要是讲如何用吧,大家如果看了有任何的问题和见解,欢迎给我留言。
XML文件如下:
<?xml version="1.0" encoding="utf-8"?>
<config>
<star>
<categorys>
<default>
<category value="00">娱乐</category>
...
</default>
<en>
<category value="00">entertainment</category>
...
</en>
</categorys>
<genders><!-- 性别 -->
<default>
<gender value="1">男</gender>
...
</default>
<en>
<gender value="1">male</gender>
...
</en>
</genders>
<comments><!-- 评论 -->
<default><!-- 默认语言 -->
<score min="90" max="100">
<comment>&&&</comment>
...
</score>
<score min="80" max="90">
<comment>$$$</comment>
...
</score>
...
</default>
</comments>
</star>
<beauty><!-- 美丽指数 -->
<comments><!-- 评论 -->
<default><!-- 默认语言 -->
<score min="90" max="100">
<comment>&&&</comment>
...
</score>
<score min="80" max="90">
<comment>%%%</comment>
...
</score>
...
</default>
</comments>
</beauty>
</config>
XMLParser方法
NSMutableArray*parserObjects;
NSMutableDictionary*dataDict;
NSString *m_strCurrentElement;
NSMutableString *tempString;
-(id)init
{
if ([super init]){
;
}
return self;
}
- (void)parseXML:(NSData *)xmlFile parseError:(NSError **)error
{
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlFile];
[parser setDelegate:self];
[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[parser setShouldResolveExternalEntities:NO];
[parser parse]; <开始解析>
NSError *parseError = [parser parserError];
if (parseError && error) {
*error = parseError;
}
[parser release];
}
- (void)dealloc
{
[m_strCurrentElement release];
[tempString release];
[super dealloc];
}
准备解析
- (void)parserDidStartDocument:(NSXMLParser *)parser {
parserObjects = [[NSMutableArray alloc] init];
}
准备解析节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
if ([elementName isEqualToString:@"config"]) {
[dataDict release];
dataDict = [[NSMutableDictionary alloc] initWithCapacity:0];
}
else if ([elementName isEqualToString:@"en"]){
typeFlag = TRUE;
}
else if ([elementName isEqualToString:@"default"]){
typeFlag = FALSE;
}
else if (([elementName isEqualToString:@"category"]) && (typeFlag == FALSE)) {
starTypeFlag = FALSE;
self.m_strCurrentElement = [attributeDict objectForKey:@"value"];
self.tempString = [NSMutableString string];
[typeValArray addObject:self.m_strCurrentElement];
}
else {
;
}
}
获取首尾节点间内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (m_strCurrentElement) {
[self.tempString appendString:string];
[dataDict setObject:string forKey:m_strCurrentElement];
if (typeFlag == FALSE) {
...
}
else {
...
}
}
}
解析完当前节点
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if (m_strCurrentElement) {
[dataDict setObject:self.tempString forKey:m_strCurrentElement];
self.m_strCurrentElement = nil;
self.tempString = nil;
}
if ([elementName isEqualToString:@"config"]) {
if (dataDict) {
[parserObjects addObject:dataDict];
}
}
}
这个XML中,有点要注意的就是,【default】【en】的子节点的名字都叫做【category】,但他们肯定不会是在同一个时候解析出来的。这下我们可以用上面蓝色部分(一个BOOL类型的变量标记一下就行了),在下面获取内容的时候也只要判断一下就OK了
XML文件如下:
<?xml version="1.0" encoding="utf-8"?>
<config>
<star>
<categorys>
<default>
<category value="00">娱乐</category>
...
</default>
<en>
<category value="00">entertainment</category>
...
</en>
</categorys>
<genders><!-- 性别 -->
<default>
<gender value="1">男</gender>
...
</default>
<en>
<gender value="1">male</gender>
...
</en>
</genders>
<comments><!-- 评论 -->
<default><!-- 默认语言 -->
<score min="90" max="100">
<comment>&&&</comment>
...
</score>
<score min="80" max="90">
<comment>$$$</comment>
...
</score>
...
</default>
</comments>
</star>
<beauty><!-- 美丽指数 -->
<comments><!-- 评论 -->
<default><!-- 默认语言 -->
<score min="90" max="100">
<comment>&&&</comment>
...
</score>
<score min="80" max="90">
<comment>%%%</comment>
...
</score>
...
</default>
</comments>
</beauty>
</config>
XMLParser方法
NSMutableArray*parserObjects;
NSMutableDictionary*dataDict;
NSString *m_strCurrentElement;
NSMutableString *tempString;
-(id)init
{
if ([super init]){
;
}
return self;
}
- (void)parseXML:(NSData *)xmlFile parseError:(NSError **)error
{
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlFile];
[parser setDelegate:self];
[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[parser setShouldResolveExternalEntities:NO];
[parser parse]; <开始解析>
NSError *parseError = [parser parserError];
if (parseError && error) {
*error = parseError;
}
[parser release];
}
- (void)dealloc
{
[m_strCurrentElement release];
[tempString release];
[super dealloc];
}
准备解析
- (void)parserDidStartDocument:(NSXMLParser *)parser {
parserObjects = [[NSMutableArray alloc] init];
}
准备解析节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
if ([elementName isEqualToString:@"config"]) {
[dataDict release];
dataDict = [[NSMutableDictionary alloc] initWithCapacity:0];
}
else if ([elementName isEqualToString:@"en"]){
typeFlag = TRUE;
}
else if ([elementName isEqualToString:@"default"]){
typeFlag = FALSE;
}
else if (([elementName isEqualToString:@"category"]) && (typeFlag == FALSE)) {
starTypeFlag = FALSE;
self.m_strCurrentElement = [attributeDict objectForKey:@"value"];
self.tempString = [NSMutableString string];
[typeValArray addObject:self.m_strCurrentElement];
}
else {
;
}
}
获取首尾节点间内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (m_strCurrentElement) {
[self.tempString appendString:string];
[dataDict setObject:string forKey:m_strCurrentElement];
if (typeFlag == FALSE) {
...
}
else {
...
}
}
}
解析完当前节点
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if (m_strCurrentElement) {
[dataDict setObject:self.tempString forKey:m_strCurrentElement];
self.m_strCurrentElement = nil;
self.tempString = nil;
}
if ([elementName isEqualToString:@"config"]) {
if (dataDict) {
[parserObjects addObject:dataDict];
}
}
}
这个XML中,有点要注意的就是,【default】【en】的子节点的名字都叫做【category】,但他们肯定不会是在同一个时候解析出来的。这下我们可以用上面蓝色部分(一个BOOL类型的变量标记一下就行了),在下面获取内容的时候也只要判断一下就OK了
相关文章推荐
- ios解析xml的两种方法,NSXMLParser和第三方库GDataXMLNode还有json数据的解析
- IOS 详解NSXMLParser方法解析XML数据方法
- iOS 详解NSXMLParser方法解析XML数据方法
- iOS 详解NSXMLParser方法解析XML数据方法
- iOS 详解NSXMLParser方法解析XML数据方法
- iOS--XML三种解析方法( XMLDictionary)、(GDataXMLNode)、(NSXMLParser)
- iOS 详解NSXMLParser方法解析XML数据方法
- iOS SDK中使用NSXMLParser解析XML
- iOS SDK中使用NSXMLParser解析XML
- iOS开发中XML的DOM和SAX解析方法
- iOS XML解析 - NSXMLParser
- <转>iOS SDK中使用NSXMLParser解析XML
- iOS开发中常见的解析XML的类库以及简要安装方法
- 【iOSXML解析】之:GDataXMLNode方法解析案例
- iOS SDK中使用NSXMLParser解析XML
- 【IOS中XML解析】NSXMLParser方法解析XML文件案例
- IOS内置NSXMLParser解析xml
- 【iOS开发-网络】两种常用的方法解析XML数据
- 解决NSXmlParser无法解析非utf-8编码的XML问题的方法
- Ios XML 不同解析方法比较