ios NSXmlparser方法 XML解析

来源:互联网 发布:网络贷款不还会怎么样 编辑:程序博客网 时间:2024/05/01 08:44

在网上查了很多这样的资料,都大差不差的简单写了下,今天我也完成了一份,内容被我简化了,主要是讲如何用吧,大家如果看了有任何的问题和见解,欢迎给我留言。

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了

 

原创粉丝点击