SAX解析器忽略CDATA - html标记

i_r*_*aqz 2 html java rss android sax

我有一个简单的Android RSS阅读器应用程序,我在其中使用SAX解析器来获取数据.除了"desc"元素之外,所有记录都被正确获取.XML结构如下.

<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>
Run Code Online (Sandbox Code Playgroud)

来自所有字段的数据作为整体提取.但是当谈到时<desc>,'characters'方法只是取"<"并忽略其余的.有人可以告诉我们可以做些什么.

Dam*_*ien 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));
   }
}
Run Code Online (Sandbox Code Playgroud)