2011-01-05 198 views
2

檢索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

回答

1

可以解析HTML畢竟HTML也xml.There類似於這stackoverflow.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

0

如果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>標記的某個位置。

1

在開始元素, 如果元素是內容,則應該初始化您的臨時Str緩衝區。 如果內容已經開始, 捕獲當前開始元素及其屬性,並將其更新爲臨時Str緩衝區。

對於字符, 如果內容已啓動,請將字符添加到當前字符串緩衝區。

結束元素 如果內容已啓動,請捕獲結束節點並添加到字符串緩衝區。

我的假設:

XML將只有一個內容標籤。

+0

+!:完整重寫此評論重新閱讀。是的,我認爲這將作爲處理我在我的答案中引用的動態XML字符串。這是一個很好的簡潔描述。 – 2011-01-05 16:57:09

0

,我覺得這樣的解決方案:

注:在這個解決方案,我想<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 []的長度因不同情況而異!