2010-04-16 7 views
0

iPhone에서 TBXML을 사용하여 XHTML 문서를 구문 분석하려고합니다 (libxml2 또는 NSXMLParser를 사용하면 편리 할 것입니다.). 나는 예를 들어, 단락의 일련의 몸의 내용을 추출하고 인라인 태그를 유지해야합니다인라인 태그가있는 XHTML 구문 분석

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
    <head> 
     <title>Title</title> 
     <link rel="stylesheet" href="css/style.css" type="text/css"/> 
     <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/> 
    </head> 
    <body> 
     <div class="body"> 
      <div> 
      <h3>Title</h3> 
      <p>Paragraph with <em>inline</em> tags</p> 
      <img src="image.png" /> 
      </div> 
     </div> 
    </body> 
</html> 

내가 지금까지 단락을 추출하지만, 단락과 <em>inline</em> 내용을 유지하기 위해 내 모든 테스트가 필요합니다 그 단어는 단락에 정확히 어디에 들어 있는지 정확히 알지 못하는 하위 요소로 추출되었습니다.

누구든지이 방법을 제안 할 수 있습니까?

감사합니다.

+0

서식에 사과드립니다. 편집을 시도했지만 어떤 이유로 오류가 발생합니다. – JWood

+0

user290796 : 코드 블록을 사용해야하는 곳에 인라인 코드 글꼴을 사용하려고했기 때문에. http://daringfireball.net/projects/markdown/syntax를 참조하십시오. –

답변

1

가정 1. p (단락) 요소의 데이터에만 관심이 있으며 NSXMLParser를 사용하고 있습니다.

가정 2. p 내부의 요소를 그대로 유지하려고합니다.

사용할 전략은 데이터를 저장해야 할시기와 수신 할 때 데이터를 무시할시기를 알 수 있도록 파서의 상태 시스템을 만드는 것입니다.

Apple의 샘플 코드를 사용하여 NSXMLParser delegate을 설정하십시오. 대리인이 데이터를 보관하거나 삭제할 때 추적 할 수 있도록 ivar BOOL inParagraph이 필요합니다. inParagaph의 초기 값은 NO입니다. 대리인이 parser:didStartElement:namespaceURI:qualifiedName:attributes: 메시지, if ([element isEqual:@"p"]) 분명 당신의 receivedData 변수를 받아 inParagraph = YES

편집을 설정하면 : receivedData가 인 NSMutableString입니다. 코드 예제가 수정되었습니다

이 시점에서 parser delegate은받은 데이터를 저장하려고합니다.

메시지가 parser:foundCharacters: 메시지가 나타나면 예제 코드와 같이 receivedData 문자열을 추가하십시오. 파서 인라인 요소를 발견하면

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

는 델리게이트 parser:didStartElement:namespaceURI:qualifiedName:attributes: 다시 나타날 것이다. 이것은 inParagraph 상태 변수가 중요한 경우입니다. 파서는 요소의 '<'및 '>'문자를 포함하지 않으므로 elementName을 '<'및 '>'문자로 묶고 receivedData에 추가해야합니다.

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict 
{ if (inParagraph) 
    { 
     NSString *inlineElementName = [NSString stringWithFormat:@"<%@>", elementName]; 
     [receivedData appendString:inlineElementName]; 
    } 
.... 
} 
parser delegate

parser:didEndElement:namespaceURI:qualifiedName: 메시지를 수신 같은 것이, 그것의 "P"요소 if (inParagraph && ![elementName isEqual:@"p"]에 있는지 확인 인라인 요소를 닫는다. if ([elementName isEqual:@"p"])receivedData의 내용을 단락이 표시된 NSMutableArray에 추가하십시오.

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if (inParagraph) 
     { 
      if (![elementName isEqual:@"p"]) 
       { 
         NSString *inlineElementName = [NSString stringWithFormat:@"</%@>", elementName]; 
        [receivedData appendString:inlineElementName];    
       } else { // received closing </p> tag add receivedData to the paragraph array 
          [paragraphsArray addObject:[receivedData copy]]; 
          [self setInParagraph:NO]; 
         } 
       } 
     } 
} 
+0

그게 내가 찾고 있던 바로 그거야! 감사! – JWood

관련 문제