2011-04-05 2 views
1

iPhone에서 NSXMLParser을 사용하여 일부 XML을 구문 분석하려고합니다. 내가 원하는 요소를 감지하면XML 하위 요소 가져 오기 - 태그 이름 포함

, 나는 가 시작 요소 및 종료 요소 사이입니다 으로 모두에게하고 싶은. 주어진 예를 들어

:

<A> 
    <K> 
     <C> 
      <D>dddd</D> 
     </C> 
     <E> eeee </E> 
    </K> 
    <F> ffff </f> 
</A> 

내가

K

를 지정하고 받고 싶습니다 :

<C> 
     <D> dddd </D> 
    </C> 
    <E> eeee </E> 

그러나, 현재 NSXMLParser는 모든 <, > 및 속성을 무시합니다. 내가 지정한 태그 사이에있는 모든 것을 얻는 데 위임 메서드에 무엇을 넣어야합니까? 여기

내가 지금 무엇을 가지고 : 사전에

//---when the start of an element is found--- 
-(void) parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *) qName attributes:(NSDictionary *) attributeDict { 

    if([elementName isEqualToString:@"ns11:createNewPrincipalResponse"]) 
    { 
     elementFound = YES; 
     NSLog(@"PrincResp FOUND"); 
    } 
} 


-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string 
{ 
    if (elementFound) 
    { 
     [parseResults appendString: string]; 
    } 
} 


//---when the end of element is found--- 
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 

    if ([elementName isEqualToString:@"ns11:createNewPrincipalResponse"]) 
    { 
     //---displays the country--- 
     NSLog(@"\n******************\nParse Results...\n*************\n\n%@",parseResults); 
     [parseResults setString:@""]; 
     token = [NSString stringWithString:parseResults]; 
     elementFound = FALSE; 
    } 
} 

감사합니다!

답변

1

아마도 element를 시작하는 위치를 얻기 위해 columnNumber, lineNumber 파서의 메소드를 사용할 수 있습니다 (예 : 찾으려는 요소의 didStartElement에서 column1, line1로 저장). 그런 다음 해당 요소가 끝나면 didEndElement에서 column2 및 line2를 다시 입력 한 다음 원본 XML에서 텍스트를 (line1, column1)에서 (line2, column2)로 자릅니다.

꽤 해킹되지만 아마도 작동 할 것입니다.

편집 : 텍스트를 추출하기 위해 이러한 라인을 따라 뭔가 할 수있는 : 파서의 위치가 요소가 시작/종료 될 때 경우

__block int lineNumber = 0; 
__block NSMutableString* result = [NSMutableString stringWithCapacity:100]; 

[str enumerateLinesUsingBlock:^(NSString* line, BOOL* stop) { 

if(lineNumber == line1) { 
    [result appendString:[line substringFromIndex:column1]]; 
} 
if(lineNumber > line1 && lineNumber < line2) [result appendString:line]; 

if(lineNumber == line2) { 
    [result appendString:[line substringToIndex:column2]]; 
} 
lineNumber++; 
if(lineNumber > line2) *stop = YES; 

}]; 

모르겠어요를 시작 또는 해당 요소의 끝에 - 직접 건너 뛰거나 요소의 끝 부분에있는 경우 column1/column2가 줄 바깥에 있는지 확인하십시오 (이 경우 아무 것도 추가하지 마십시오). 또한, 개행 문자를 유지해야하는 경우 appendString 대신 str을 사용하십시오 (stend).

+0

OK, 나는 열과 행 번호를 성공적으로 얻었습니다. 특정 열과 행에서 다른 열과 행으로 부분 문자열을 추출하는 데 사용할 수있는 방법이 있습니까? – klyngbaek

+0

수정 된 답변의 예보기 – SVD

+0

감사합니다. 코드가 트릭을 수행합니다. 그러나 구문 분석기에서 반환 한 열 번호와 줄 번호는 올바른 색인입니다. (위의 코드는 문자열과 함께 작동하지만 파서에 대한 입력은 데이터입니다.) – klyngbaek

0

NSXmlParser를 사용하는 것은 상당히 끔찍한 일입니다. 대신 구문 분석을 위해 LibXML을 사용해 보셨나요? 그런 다음 XPath을 사용하여 XML을 쿼리 할 수 ​​있습니다. 이는 XML 문서를 훨씬 더 단순하게 파싱하는 표준 방법입니다.

+0

팁 덕분에 그것을 들여다보십시오. – klyngbaek

관련 문제