SAX解析器:从XML
检索HTML标签我有一个XML来解析,这下面SAX解析器:从XML
给出<feed>
<feed_id>12941450184d2315fa63d6358242</feed_id>
<content> <fieldset><table cellpadding='0' border='0' cellspacing='0' style="clear :both"><tr valign='top' ><td width='35' ><a href='http://mypage.rediff.com/android/32868898' class='space' onmousedown="return enc(this,'http://track.rediff.com/click?url=___http%3A%2F%2Fmypage.rediff.com%2Fandroid%2F32868898___&service=mypage_feeds&clientip=202.137.232.113&pos=0&feed_id=12941450184d2315fa63d6358242&prc_id=32868898&rowid=674061088')" ><div style='width:25px;height:25px;overflow:hidden;'><img src='http://socialimg04.rediff.com/image.php?uid=32868898&type=thumb' width='25' vspace='0' /></div></a></td> <td><span><a href='http://mypage.rediff.com/android/32868898' class="space" onmousedown="return enc(this,'http://track.rediff.com/click?url=___http%3A%2F%2Fmypage.rediff.com%2Fandroid%2F32868898___&service=mypage_feeds&clientip=202.137.232.113&pos=0&feed_id=12941450184d2315fa63d6358242&prc_id=32868898&rowid=674061088')" >Android </a> </span><span style='color:#000000 !important;'>testing</span><div class='divtext'></div></td></tr><tr><td height='5' ></td></tr></table></fieldset><br/></content>
<action>status updated</action>
</feed>
标签包含HTML内容,其中包含了我所需要的数据。我正在使用SAX解析器。这是我在做什么
private Timeline timeLine; //Object
private String tempStr;
public void characters(char[] ch, int start, int length)
throws SAXException {
tempStr = new String(ch, start, length);
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (localName.equalsIgnoreCase("content")) {
if (timeLine != null) {
timeLine.setContent(tempStr);
}
}
这个逻辑的工作原理是什么?如果不是,我应该如何使用SAX解析器从XML中提取嵌入的HTML数据。
可以解析HTML毕竟HTML也xml.There类似于这*.You链接可以试试这个How to parse the html content in android using SAX PARSER
(在一般情况下,即使在这种情况下,“html也是xml”是不正确的。) – 2011-01-05 11:16:27
+1:这个问题被接受的答案是处理这个问题的最简单方法。 – 2011-01-05 12:38:34
HTML是* so *完全不是XML。 SAX解析器死亡,如果您手动它img或p标签没有关闭...这是有效的HTML,如果不是有效的XHTML。 – mjfgates 2012-06-02 22:47:10
如果HTML实际上是XHTML,你可以使用SAX解析它,并提取<content>
标签的xhtml内容,但几乎没有这么简单。
您必须让您的处理程序实际上对由<content>
标记内的所有xhtml标记引发的事件作出响应,并且要么构建类似于DOM结构的东西,然后将其序列化回xml表单,或即时直接写入复制内容的xml字符串缓冲区。
如果您修改了xml,以便在How to parse the html content in android using SAX PARSER中建议将内容标记中的html包装在CDATA元素中,那么距离您的代码不太远的确实可行。
但是,您不能只将内容放入characters
方法中的String tempStr
变量中。您需要有一个startElement
方法,该方法在查看<content>
标记时将字符串的缓冲区初始化,并将其收集到characters
方法的缓冲区中,然后将endElement
的结果放在<content>
标记的某个位置。
在开始元素, 如果元素是内容,则应该初始化您的临时Str缓冲区。 如果内容已经开始, 捕获当前开始元素及其属性,并将其更新为临时Str缓冲区。
对于字符, 如果内容已启动,请将字符添加到当前字符串缓冲区。
结束元素 如果内容已启动,请捕获结束节点并添加到字符串缓冲区。
我的假设:
XML将只有一个内容标签。
+!:完整重写此评论重新阅读。是的,我认为这将作为处理我在我的答案中引用的动态XML字符串。这是一个很好的简洁描述。 – 2011-01-05 16:57:09
,我觉得这样的解决方案:
注:在这个解决方案,我想<chapter>
标签(<chapter> ... html content ... </chapter>)
之间的HTML内容
DefaultHandler handler = new DefaultHandler() {
boolean chap = false;
public char[] temp;
int chapterStart;
int chapterEnd;
public void startElement(String uri, String localName,
String qName, Attributes attributes)
throws SAXException {
System.out.println("Start Element :" + qName);
if (qName.equalsIgnoreCase("chapter")) {
chap = true;
}
}
public void endElement(String uri, String localName,
String qName) throws SAXException {
if (qName.equalsIgnoreCase("chapter")) {
System.out.println(new String(temp, chapterStart, chapterEnd-chapterStart));
}
System.out.println("End Element :" + qName);
}
public void characters(char ch[], int start, int length)
throws SAXException {
if (chap) {
temp = ch;
chapterStart = start;
chap = false;
}
chapterEnd = start + length;
}
};
更新:
我的代码有一个错误。因为DocumentHandler中ch []的长度因不同情况而异!
'timeLine'和'tempStr'从哪里来? – 2011-01-05 09:20:30
@精英绅士编辑支持请求变量。 – 2011-01-05 09:39:49