ios NSXmlparser方法 XML解析

在網上查了很多這樣的資料,都大差不差的簡單寫了下,今天我也完成了一份,內容被我簡化了,主要是講如何用吧,大家如果看了有任何的問題和見解,歡迎給我留言。

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了

 

發佈了46 篇原創文章 · 獲贊 3 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章