2014-02-21 145 views
0

我想解析如下的XML。NSXMLParser不解析html標籤

<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> 

我使用的是正常的解析過程

我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的第一個項目解析

#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 

然而我只是ge t「>」作爲消息,我應該將文本嵌入到html標記中。我讀了解其他解析技術,知道NSXMParser的缺點,但我只想要文本。我會自己轉換並分割html。請幫助我。

N:B: - 我正在用foundCharacters方法中的html標籤獲取所需的文本,但它們進入循環。

+0

對不起,好像它不是HTML – Injectios

+0

@Injectios請看第一項的消息節點。你會看到html標籤。 – Saty

+0

那麼我應該怎麼做才能解析這些標籤。你有什麼主意嗎? – Saty

回答

0

有兩個問題在這裏:

  1. XML是不是精心設計的:你message元素的內容應該編碼的HTML。一種方法是更換<>,並&&lt;&gt;&amp;

    <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> 
    

    或者,由Daij-Djan描述,您可以使用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.4 Character Data and Markup,XML規範。

  2. 您的foundCharacters錯誤地假定字段的內容將始終由對該方法的單個調用返回。這不是一個有效的假設。您應始終假定可能需要多次致電foundCharacters才能返回整個值。因此,在didStartElement中實例化currentNodeElement,將其附加到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應該被定義爲NSMutableString,而不僅僅是一個NSString