2010-09-05 139 views
2

我有一個簡單的Android RSS閱讀器應用程序,我在其中使用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>時,「字符」方法僅提取「<」並忽略其餘部分。請有人建議可以做些什麼。

回答

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

達你好,我想通了,你剛纔說。但我不確定如何使用標記的characters()和endElement()。你能否詳細說明一下。會真的感謝你。 – 2010-09-05 14:38:27

+0

@Abdul我編輯了我的答案,添加了代碼片段。希望能幫助到你。 – Damien 2010-09-05 18:01:50

+0

非常感謝你Damien ... – 2010-09-06 08:50:34