2013-03-20 42 views
0

我有這個相當複雜的XML從我的服務器返回,我想要一些幫助將它解析成一個對象,我可以爲以後使用。使用NSXMLParser解析複雜的XML結構

這是XML的樣子

<Eng> 
    <Result   > 
     <Series   > 
      <Link/> 
      <FMF/> 
       <AlsoLink/> 
       <Plugins/> 
      </FMF> 
      <Sheet   > 
       <Spaces> 
        <Spacing   > 
        <Names/> 
        </Spacing> 
        <Spacing   > 
        <Names/> 
        </Spacing> 
       </Spaces> 
      </Sheet> 
     </Series> 
    </Result> 
</Eng> 

我然後使用的NSXMLParser,試圖解析所有的XML各元素的「ObjectForKey /秒」到自己的dictionarys ..如果讓感。

這是我的代碼,目前看起來像

#pragma mark - Parsing lifecycle 

- (void)startTheParsingProcess:(NSData *)parserData 
{ 
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:parserData]; //parserData passed to NSXMLParser delegate which starts the parsing process 
    [parser setDelegate:self]; 
    [parser parse]; // starts the event-driven parsing operation. 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    if([elementName isEqualToString:@"Series"]){ 
     parsedMutableDictionary = [[NSMutableDictionary alloc] initWithDictionary:attributeDict]; 
     self.parsedDataArrayOfDictionaries = [NSMutableArray arrayWithCapacity:8]; 

     if ([elementName isEqualToString:@"Link"]) { 

     } 
     if ([elementName isEqualToString:@"FMF"]) { 
      if ([elementName isEqualToString:@"AlsoLink"]) { 

      } 
      else if ([elementName isEqualToString:@"Plugins"]) { 

      } 
     } 
     else if ([elementName isEqualToString:@"Sheet"]) { 

      if ([elementName isEqualToString:@"Spaces"]) { 

       if ([elementName isEqualToString:@"Spacing"]) { 

        if ([elementName isEqualToString:@"Names"]) { 

        } 
       } 
      } 

     } 
    } 

} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{  
    if([elementName isEqualToString:@"Series"]){ 
     [parsedDataArrayOfDictionaries addObject:parsedMutableDictionary]; 

     if ([elementName isEqualToString:@"Link"]) { 

     } 
     if ([elementName isEqualToString:@"FMF"]) { 
      if ([elementName isEqualToString:@"AlsoLink"]) { 

      } 
      else if ([elementName isEqualToString:@"Plugins"]) { 

      } 
     } 
     else if ([elementName isEqualToString:@"Sheet"]) { 

      if ([elementName isEqualToString:@"Spaces"]) { 

       if ([elementName isEqualToString:@"Spacing"]) { 

        if ([elementName isEqualToString:@"Names"]) { 

        } 
       } 
      } 

     } 
    } 


//  parsedMutableDictionary = nil; 
} 

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError 
{ 
    NSLog(@"Paser Error = %@", parseError); 
    UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"A parsing failure occurred." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
    [errorAlert show]; 
} 


//TODO: Look into how to use this method over multiple views. i.e.(other requests such as keycode, advanced) 
- (void)parserDidEndDocument:(NSXMLParser *)parser 
{ 
    // display values 
     NSArray *filteredArray = parsedDataArrayOfDictionaries; 
     NSLog(@"%@", filteredArray); 

} 

我遇到的問題是,我不明白我應該有自己的對象...也當一些值回我可以有多個間距元素,我只是不知道如何處理...

任何幫助或提示將非常感激,如果我沒有指定的東西只是問,因爲我的大腦只是努力圍繞這個問題。

謝謝。

+0

我不確定這是否有幫助,但是,我只是把它扔到那裏,希望不會被拒絕投票 - 但是,無論如何,您可以將數據的輸出從XML更改爲JSON嗎?解析JSON是一個簡單的XML編輯器。 – Jordan 2013-03-20 20:59:44

+0

不幸的是,我不得不處理我所給的感謝評論。 – HurkNburkS 2013-03-20 21:22:40

回答

2

假設你的XML文件....

<Series element1="something" element2="something"> 
    <Spaces> 
     <Spacing> 
       <Names> 
       Something 
       </Names> 
     </Spacing> 
     <Spacing> 
       <Names>Something</Names> 
     </Spacing> 
    </Spaces> 
</Series> 

要獲得的部件1,你所要做的價值.....

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    if([currentElement isEqualToString:@"Series"]) { 
     NSLog(@"%@",[attributeDict objectForKey:@"element1"]); 
    } 
} 

爲了得到間距,你必須做的多重價值....

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    if([currentElement isEqualToString:@"name"]) { 
     [currentSpacingName appendString:string]; 
     [currentSpacingName appendString:@"any character"] 
    } 
} 

那家商店的價值與在這種方法的願望鍵一本字典後...

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 

這是隻是一個例子,我希望現在你可以解決你的問題。

+0

BOOM!這正是我希望看到的......我得出了這個結論,但卻無法以難以置信的方式將它置於我的頭上,更別說將它構建成別人幫助我的問題......好吧我會繼續這一點,並嘗試啓動並運行..謝謝你的幫助。 – HurkNburkS 2013-03-20 22:57:21

0

你正在使用的NSXMLParser ....所以你會得到標籤之間的串... <tag>strings</tag>

爲了讓您可以追加所有字符串中的NSString對象的多個間隔件..

+0

是的,我的標籤之間我有鑰匙..是正確的工作? elementone =「1」elementtwo =「2」等等,所以我把它們存儲到一個MutableDictionary中,然後我把我的mutableDictionary放到一個數組中......我感到困惑的是結構和多個元素,即我有多個間距..我不知道該如何儲存它們。 – HurkNburkS 2013-03-20 22:11:13