2010-09-05 4 views
2

У меня есть приложение для чтения Android для Android, в котором я использую синтаксический анализатор SAX для извлечения данных. Все записи выбираются правильно, за исключением элемента «desc». Структура XML выглядит следующим образом.SAX-анализатор, игнорирующий CDATA-html-теги

<item> 
<title>Boilermaker Jazz Band</title> 
<link>http://eventur.sis.pitt.edu/event.jsp?e_id=1805</link> 
<type>Music Concerts</type> 
<s_time>09-02-2010 05:00 PM&nbsp;</s_time> 
<venue>Backstage Bar at Theater Square</venue> 
<venue_addr/> 
<desc> 
<p><span style="font-family: arial, geneva, sans-serif; font-size: 11px;"> 
<p style="font-family: Arial, Helvetica, sans-serif; max-width: 600px; margin-top: 8px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; font-size: 9pt; vertical-align: top;">Authentic American Jazz, Ragtime and Swing The Boilermaker Jazz Band is an ecstatically fun band performing authentic hot jazz, ragtime, and swing. The group has ....</desc> 
− 
<img_link> 
http://eventur.sis.pitt.edu/images/Boilheadshot1.jpg 
</img_link> 
</item> 

Данные из всего поля выбраны в целом. Но когда дело доходит до <desc>, метод 'characters' просто выбирает «<» и игнорирует остальные. Может кто-нибудь, пожалуйста, сообщите, что можно сделать.

ответ

6

Элемент <desc> содержит другую (недействительную) структуру XML. В вашем примере startElement() будет запущен для <p>, затем <span>, затем еще <p>. Если вы хотите извлечь только текст, вы можете связать то, что метод characters() возвращает для всех детей <desc>, пока вы не получите уведомление об окончании элемента <desc> с endElement().

Что-то вроде

private boolean isDescStarted = false; 

private StringBuilder textDesc = new StringBuilder(); 

public void startElement(String uri, String name, String qName, Attributes atts) { 
    if(name.equals("desc") {isDescStarted = true;} 
} 

public void endElement(String uri, String name, String qName) { 
    if(name.equals("desc") { 
     isDescStarted = false; 
     String fullTextDesc = textDesc.toString(); // do whatever you want with this string now 
    } 
} 

public void characters(char[] buf, int offset, int length) { 
    if (isDescStarted) { 
     textDesc.append(new String(buf, offset, length)); 
    } 
} 
+0

Здравствуйте Damien, я понял, что вы только что сказали. Но я не уверен, как использовать символы() и endElement() для тега . Не могли бы вы рассказать. Было бы очень благодарно вам. –

+0

@Abdul Я отредактировал свой ответ, добавив фрагмент кода. Надеюсь, поможет. – Damien

+0

Большое спасибо Damien ... –

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