2014-02-21 5 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 

Однако для первого элемента Я просто t ">" в качестве сообщения, где я должен получить текст, встроенный в теги html. Я читал о другой технике синтаксического анализа, зная, что недостаток NSXMParser, но я просто хочу текст. Я конвертирую и разделяю html самостоятельно. Пожалуйста, помогите мне.

N: B: - Я получаю желаемые тексты с тегами html в методе foundCharacters, но они входят в цикл.

+0

извините, похоже, что это не HTML – Injectios

+0

@ Инъекции, пожалуйста, посмотрите на узел сообщения первого элемента. Вы увидите теги 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-Джан, вы можете использовать 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. Таким образом, создайте экземпляр currentNodeElement в didStartElement, добавьте его в 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.

Смежные вопросы