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数据。

+0

'timeLine'和'tempStr'从哪里来? – 2011-01-05 09:20:30

+0

@精英绅士编辑支持请求变量。 – 2011-01-05 09:39:49

可以解析HTML毕竟HTML也xml.There类似于这*.You链接可以试试这个How to parse the html content in android using SAX PARSER

+0

(在一般情况下,即使在这种情况下,“html也是xml”是不正确的。) – 2011-01-05 11:16:27

+0

+1:这个问题被接受的答案是处理这个问题的最简单方法。 – 2011-01-05 12:38:34

+0

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将只有一个内容标签。

+0

+!:完整重写此评论重新阅读。是的,我认为这将作为处理我在我的答案中引用的动态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 []的长度因不同情况而异!