2014-02-12 3 views
1

NSXMLParser를 사용하여 XML 파일의 기본 구문 분석을 이해한다고해서 다음과 같은 상황이 발생합니다. 특정 속성의 값이 서로 다른 여러 요소가 있으므로 <table_data>...</table_data>입니다. 예를 들어 : NSXMLParser didStartElement 특정 속성이있는 경우에만

<table_data attr="one">...</table_data> 

<table_data attr="two">...</table_data> 

<table_data attr="three">...</table_data> 

는 didStartElement에있는 동안, 나는 파서 계정으로는 attr="one"이있는 경우에만 시작 요소로 <table_data> 요소를 소요하고 싶습니다.

이것은 내가 지금까지 등

<table_data attr="one">의 아이 요소의 내용을 얻을 수 있지만 <table_data attr="two">, <table_data attr="three">의 수 foundCharacters에서 그 의미 것,이 시도 :

- (void)parser:(NSXMLParser*)parser didStartElement:(NSString *)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary*)attributeDict { 

    elementoCorrente = [elementName copy]; 

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

     if ([[attributeDict objectForKey:@"attr"] isEqualToString:@"one"]) { 
      stringDesc = [[NSMutableString alloc] init]; 

     } 

    } 

} 


- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 


    if ([elementoCorrente isEqualToString:@"field"]) { 

     [stringDesc appendString:string]; 
     NSLog(@"%@",string); 
    } 


} 

하지만 나는 <field> 요소, 모든 하위의 내용에 대한 로그를 얻는다. <table_data>. <table_data attr="one">의 하위 요소 인 경우 <field> 요소의 내용 만 인쇄 할 수 있습니까? 감사 파비오

답변

3

foundCharacterstable_data의 다른 어커런스에 대한 데이터를 추가하는 것을 중지하지 않는 것이 문제입니다. didStartElementattributeDict[@"attr"] 값을 저장할 수 있습니다. foundCharacterselementoCorrenteattributeDict[@"attr"] 값을 보유하고있는이 새로운 ivar를 모두 확인할 수 있습니다. 예를 들어 :

- (void)parser:(NSXMLParser*)parser didStartElement:(NSString *)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary*)attributeDict { 

    elementoCorrente = nil; 
    atributoCorrente = nil; 

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

     if ([attributeDict[@"attr"] isEqualToString:@"one"]) { 
      elementoCorrente = [elementName copy]; 
      atributoCorrente = [attributeDict[@"attr"] copy]; 
      stringDesc = [[NSMutableString alloc] init]; 
     } 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    if ([elementoCorrente isEqualToString:@"table_data"] && [atributoCorrente isEqualToString:@"one"]) { 

     [stringDesc appendString:string]; 
    } 
} 

솔직히, 당신은 아마 당신이 그것을 저장하고 싶어 어디든지 그 stringDesc을 절약, 너무 didEndElement 구현을 원하고 nilelementoCorrente을 설정합니다.

+0

제 생각에는 올바른 대답입니다. 그리고 그것이 얼마나 쉬운 지 믿기지 않습니다. 부끄러운 줄 알았어 ... Rob에게 시간을내어 작업 코드를 제공하는 데 많은 시간을 보냈습니다. :) 또한 Helderdarocha의 대답은 내가 할 수있는 두 사람 덕분에 좋은 일이었습니다! –

1

는 아마도 코드는 뭔가가 있지만, 단지 테스트 당신이 parser:foundCharacters: 방법은 경우입니다에서 확인하기 때문에 당신은 모든 field 태그의 내용을 인쇄하려면, 여기에 표시되는 것과, 예상 된 동작입니다 현재 요소는 field입니다.

table_data 안에 있음을 나타내는 플래그를 attr_one과 함께 추가 할 수 있습니다. 같은 뭔가 : insideTableOne 문자열을 추가하기 전에 해당하는 경우 parser:foundCharacters:에서 다음

if ([[attributeDict objectForKey:@"attr"] isEqualToString:@"one"]) { 
    stringDesc = [[NSMutableString alloc] init]; 
    insideTableOne = YES; 
} 

그리고도 테스트합니다.

예상되는 특성이없는 table_data을 찾으면 프로그램이 중단되지 않도록이 테스트도 필요합니다. 이 경우 stringDesc은 아직 인스턴스화되지 않았습니다.