2013-08-26 3 views
6

메신저를 sub_category있는 하위 데이터를 분석하고 보여주기 위해 노력하고 있지만 상위 카테고리의 관련 sub_category 표시됩니다. 부모 요소의 데이터를 구문 분석하는 데는 성공했지만 자식 요소를 구문 분석하는 방법에 문제가 있습니다. 얻기 데이터

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
    if([elementName isEqualToString:@"category"]){ 
     dataCurrent = [dataFileHolder alloc]; 
    } 
} 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    currentList = [[NSMutableString alloc] initWithString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; 

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

    if([elementName isEqualToString:@"name"]){ 
     dataCurrent.nameOfCat = currentList; 
    } 
    if ([elementName isEqualToString:@"description"]){ 
     dataCurrent.descriptionOfCat = currentList; 
    } 
    if ([elementName isEqualToString:@"image"]) { 
     dataCurrent.imageLink = currentList; 
    } 
    if ([elementName isEqualToString:@"category"]) { 
     [listPopulated addObject:dataCurrent]; 
     dataCurrent = nil; 
     currentList = nil; 
    } 
} 

와 XML 파일이

<category> 
     <name>Food</name> 
     <description>food description</description> 
     <image> Link Here </image> 
      <sub_cat> 
       <sub_name>Sub name</sub_name> 
       <sub_desc>sub cat description</sub_desc> 
       <sub_image> Link </sub_image> 
      </sub_cat> 
      <sub_cat> 
       <sub_name>Sub name</sub_name> 
       <sub_desc>sub cat description</sub_desc> 
       <sub_image> Link </sub_image> 
      </sub_cat> 
</category> 

처럼 그리고 나는 Event Driven XML Parsing에 대해 연구하고 또한 스레드 xml-parse-only-certain-child-elements 중 하나에서 하느님의 참조를 찾을 수 있지만, 최종 메신저 아직도 꽤에 대한 혼동되어 XML 및 구문 분석 물건. 나는 라멘 기간이 필요할지도 모른다. 그리고 파싱 부분을 수행하는 방법을 알고 싶습니다.

답변

7

난 당신이 IOS 네이티브 XML 파서 자체를 사용할 수 있기를 바랍니다 있습니다. XML은 다루기가 매우 쉽습니다. 그냥 각 노드에 대한 사전을 만들어 배열에 넣어보십시오. 결국에는 데이터를 쉽게 반복 할 수있는 사전을 얻을 수 있습니다.

NSMutableArray *dataArray & NSMutableDictionary *dataDict & NSMutableDictionary *subcatDict NSMutableArray *subCatArray을 만들고 currentElement이라는 .h 파일에 NSString도 하나 있습니다.

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
    currentElement = elementName; 
    if([elementName isEqualToString:@"category"]){ 
     dataDict = [[NSMutableDictionary alloc] init]; 
    } 
    else if ([elementName isEqualToString:@"sub_cat"]) { 
     if(!subCatArray) { 
      subCatArray = [[NSMutableArray alloc] init]; 
     } 
     subcatDict = [[NSMutableDictionary alloc] init]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if(dataDict && !subCatArray){ 
     [dataDict setObject:string forKey:currentElement]; 
    } 
    else if(subCatArray && subcatDict) { 
     [subcatDict setObject:string forKey:currentElement]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    if([elementName isEqualToString:@"category"]){ 
     [dataDict setObject:subCatArray forKey:@"sub_cat"]; 
     [dataArray addObject:dataDict]; 
     subCatArray = nil; 
     dataDict = nil; 
    } 
    else if([elementName isEqualToString:@"sub_cat"]){ 
     [subCatArray addObject:subcatDict]; 
     subcatDict = nil; 
    } 
} 

이렇게하면 도움이됩니다.

+0

이 부분까지이 작업을 수행했습니다. 이제 막 누락 된 im은 부모보기 컨트롤러의 태그 안에있는 자식 데이터를 내 자식보기 컨트롤러로 전달하는 것입니다. –

+0

그런 다음 subcat 배열을 만들고 subcat 키를 사용하여 dataDict에 해당 배열을 저장하십시오. –

+1

은 업데이트 된 답변을 참조하십시오. 이제 dataArray에 하나의 dataDict가 생깁니다. sub_cat 키를 사용하여 sub_cat 배열을 가져올 수 있습니다. 그런 다음보기 컨트롤러에 전달할 수 있습니다. –

0

예를 RaptureXML를 들어, 타사 XML 파서 중 하나 봅니다.

는 그런 다음에 데이터를 구문 분석 :

RXMLElement *rootXML = [RXMLElement elementFromXMLData:yourXMLData]; 

그 결과 루트 요소 조회 :

NSLog(@"Category name: %@", [rootXML child:@"name"].text); 

[rootXML iterate:@"image.sub_cat" usingBlock: ^(RXMLElement *e) { 
    NSLog(@"Sub name: %@", [e child:@"sub_name"].text); 
}];  
+0

당신은, 지금 구문 분석을 수행 한 내가 주어진 데이터를 구문 분석 방법에 조금 설명해 수 있습니다하지만 난 너무 raptureXML를 사용하여 같은 몇 가지 다른 방법을 알고, 그리고 BTW 내가 보여 곳 스토리 보드에 구현 메신저 것 첫 번째 tablevView의 부모 데이터 다음 뷰의 자식. –

+0

'RXMLElement'를 생성하여 데이터를 파싱 할 수 있습니다. 'child :'메소드를 사용하여 단일 요소에 대한 결과 객체를 쿼리하고 위와 같이'iterate : usingBlock :'을 사용하여 다중 요소를 쿼리합니다. – eik