您的位置:首页 > 移动开发 > IOS开发

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了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: