2013-03-20 1 views
0

이 복잡한 XML이 내 서버에서 반환되었으므로 나중에 사용할 수 있도록 객체로 파싱하는 데 도움이 필요합니다. NSXMLParser를 사용하여 복잡한 XML 구조 구문 분석

내가 다음 시도하고 그 만드는 경우 .. 자신의 dictionarys에 XML의 각 요소의 "ObjectForKey/S"의 모든 구문 분석 NSXMLParser를 사용하고
<Eng> 
    <Result   > 
     <Series   > 
      <Link/> 
      <FMF/> 
       <AlsoLink/> 
       <Plugins/> 
      </FMF> 
      <Sheet   > 
       <Spaces> 
        <Spacing   > 
        <Names/> 
        </Spacing> 
        <Spacing   > 
        <Names/> 
        </Spacing> 
       </Spaces> 
      </Sheet> 
     </Series> 
    </Result> 
</Eng> 

같은 XML 보이는 것입니다 감각.

이 내 코드는 현재

#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); 

} 

나는 데 문제처럼 찾고있는 것이다 것은 내가 자신의 객체에해야 이해 해달라고입니다 ... 이러한 값 중 일부는 내가 할 수있는 돌아올 때 여러 개의 간격 요소가 있고 그걸 처리하는 방법을 모르겠다. ...

내 머리가이 문제를 해결하기 위해 고심 중이다.

감사합니다.

당신이 태그 사이의 문자열을 얻을 것이다, 그래서 당신은 .... NSXMLParser를 사용하는
+0

이 정보가 도움이 될지 모르겠다.하지만이 코드를 던져 버리고 투표를 거절하면 안된다.하지만 어쨌든 XML 출력을 JSON으로 바꿀 수 있을까? JSON 구문 분석은 XML에 적합합니다. – Jordan

+0

unfortunatly not .. 나는 의견을 주신 것에 대해 감사 드려야 만합니다. – HurkNburkS

답변

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

은 당신이해야 할에서 element1의 값을 얻으려면 .... XML 파일을 가정

- (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 didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 

... 그 상점이 방법의 욕망 키를 사전에 값을 후

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

.... 당신이해야 할 간격의 여러 값을 얻으려면 지금 당신이 당신의 문제를 해결할 수 있기를 바랍니다.

+0

붐! 이것은 내가 바라는 바였습니다 ... 나는이 결론에 이르렀지만, 다른 사람들에게 나를 돕기위한 질문으로 그것을 구성하는 것만 큼 불가능한 방식으로 내 머리 속으로 들어가는 데 어려움을 겪고있었습니다 ... 좋아요. 나는 이것을 계속하고 그것을 시작하려고 노력한다. 당신의 도움에 감사드립니다. – HurkNburkS

0

... <tag>strings</tag>

당신이있는 NSString 객체의 모든 문자열을 추가 할 수있는 여러 간격 요소를 얻으려면 ...

+0

음, 내 태그 사이에 열쇠가 .. 그게 정확한 일인가요? elementone = "1"elementtwo = "2"등등 그래서 나는 MutableDictionary에 저장한다. 배열에 my mutableDictionary를 둔다 ... 내가 혼란스러워하는 것은 구조와 다중 요소이다. 나는 내가 어떻게 그들을 저장해야하는지에 관해 머리를 알 수 없다. – HurkNburkS