2014-02-21 6 views
0

다음과 같이 xml을 구문 분석하려고합니다. 내가 첫 번째 항목에 대한NSXMLParser가 html 태그를 구문 분석하지 않습니다.

#import "XMLParser.h" 

@implementation XMLParser 
@synthesize datas; 

-(id) loadXMLByURL:(NSString *)urlString 
{ 
    datas   = [[NSMutableArray alloc] init]; 
    NSURL *url  = [NSURL URLWithString:urlString]; 
    NSData *data = [[NSData alloc] initWithContentsOfURL:url]; 
    NSLog(@"Data is %@",data); 
    parser   = [[NSXMLParser alloc] initWithData:data]; 
    parser.delegate = self; 
    [parser parse]; 
    return self; 
} 

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    if ([elementname isEqualToString:@"item"]) 
    { 
     recentEnquiry = [XMLData alloc]; 
    } 
} 

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if ([elementname isEqualToString:@"title"]) 
    { 
     recentEnquiry.title = currentNodeContent; 

    } 
    if ([elementname isEqualToString:@"time"]) 
    { 
     recentEnquiry.time = currentNodeContent; 
    } 
    if ([elementname isEqualToString:@"message"]) 
    { 
     recentEnquiry.message = currentNodeContent; 
     [datas addObject:recentEnquiry]; 
    } 
} 

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
} 

@end 

그러나 일반적인 분석 절차

내 Parser.h

#import "XMLData.h" 
@interface XMLParser : NSObject<NSXMLParserDelegate> 
{  
    NSMutableString *currentNodeContent; 
    NSMutableArray *datas; 
    NSXMLParser  *parser; 
    XMLData  *recentEnquiry; 
} 
@property (readonly, retain) NSMutableArray *datas; 

-(id) loadXMLByURL:(NSString *)urlString; 

내 Parser.m를 사용하여 분석하고

<xml> 
<item> 
<title> 
21/2/2014 13:18:22 
</title> 
<time> 
2014-02-21 02:49:03 
</time> 
<message> 
<strong> 
abcd</strong><br /><br /><em>abcd</em><br /><br /><u>abcd</u><br /><br /><br /> 
</message> 
</item> 
<item> 
<title> 
21/2/2014 12:9:40 
</title> 
<time> 
2014-02-21 01:57:28 
</time> 
<message> 
100 
</message> 
</item> 
</xml> 

나는 단지 ge t ">"라는 메시지를 HTML 태그에 포함 된 텍스트로 가져와야합니다. 다른 구문 분석 기법에 대해서는 NSXMParser의 단점을 알고 텍스트를 원한다는 사실을 알게되었습니다. 나는 혼자서 html을 변환하고 나눌 것이다. 제발 도와주세요.

N : B : foundCharacters 메소드에서 html 태그를 사용하여 원하는 텍스트를 가져오고 있지만 루프가 있습니다.

+0

죄송합니다. HTML이 아닌 것 같습니다. – Injectios

+0

@Injectios 첫 번째 항목의 메시지 노드를 확인하십시오. html 태그가 표시됩니다. – Saty

+0

그런 다음이 태그를 구문 분석하려면 어떻게해야합니까? 너는 어떤 생각을 가지고 있니? – Saty

답변

0

이 여기에 문제가 있습니다 : HTML을 인코딩해야 당신의 message 요소의 내용 : XML이 잘 설계되지

  1. 가. 한 가지 방법은 <, >&&lt;와, &gt;&amp;을 대체하는 것입니다 :

    Daij-Djan에 의해 설명 된 바와 같이
    <xml> 
    <item> 
    <title> 
    21/2/2014 13:18:22 
    </title> 
    <time> 
    2014-02-21 02:49:03 
    </time> 
    <message> 
    &lt;strong&gt; 
    abcd&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;abcd&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;abcd&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; 
    </message> 
    </item> 
    <item> 
    <title> 
    21/2/2014 12:9:40 
    </title> 
    <time> 
    2014-02-21 01:57:28 
    </time> 
    <message> 
    100 
    </message> 
    </item> 
    </xml> 
    

    또는, 당신은 사용할 수 있습니다 CDATA (<![CDATA[ 연과 ]]> 종료) :

    <xml> 
    <item> 
    <title> 
    21/2/2014 13:18:22 
    </title> 
    <time> 
    2014-02-21 02:49:03 
    </time> 
    <message> 
    <![CDATA[ 
    <strong> 
    abcd</strong><br /><br /><em>abcd</em><br /><br /><u>abcd</u><br /><br /><br /> 
    ]]> 
    </message> 
    </item> 
    <item> 
    <title> 
    21/2/2014 12:9:40 
    </title> 
    <time> 
    2014-02-21 01:57:28 
    </time> 
    <message> 
    100 
    </message> 
    </item> 
    </xml> 
    

    <, >&의 예약 된 문자 처리에 대한 자세한 내용은을 참조하십시오., XML 스펙.

  2. foundCharactersfoundCharacters은 필드의 내용이 해당 메서드에 대한 단일 호출로 항상 반환된다고 잘못 가정합니다. 그것은 유효한 가정이 아닙니다. 전체 값을 반환하려면 항상 foundCharacters을 여러 번 호출해야한다고 가정해야합니다. 따라서 currentNodeElementdidStartElement에 인스턴스화하고 foundCharacters에 추가하고 didEndElement에 저장하고 다시 설정하십시오. 따라서 당신이 뭔가를 할 수 있습니다 :

    - (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
    { 
        if ([elementname isEqualToString:@"item"]) 
        { 
         recentEnquiry = [[XMLData alloc] init]; 
        } 
        else if ([elementname isEqualToString:@"title"] || [elementname isEqualToString:@"time"] || [elementname isEqualToString:@"message"]) 
        { 
         currentNodeContent = [NSMutableString string]; 
        } 
    } 
    
    - (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
    { 
        if ([elementname isEqualToString:@"title"]) 
        { 
         recentEnquiry.title = [currentNodeContent stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
        } 
        else if ([elementname isEqualToString:@"time"]) 
        { 
         recentEnquiry.time = [currentNodeContent stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
        } 
        else if ([elementname isEqualToString:@"message"]) 
        { 
         recentEnquiry.message = [currentNodeContent stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
        } 
        else if ([elementname isEqualToString:@"item"]) 
        { 
         [datas addObject:recentEnquiry]; 
        } 
    
        currentNodeContent = nil; 
    } 
    
    - (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
    { 
        [currentNodeContent appendString:string]; // do not trim whitespace here 
    } 
    

    분명히 currentNodeContent는, 다만 NSStringNSMutableString로 정의되어야한다.