2011-01-05 3 views
2

У меня есть XML, который будет обработан, который, как указано нижеSAX Parser: Получение HTML теги 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 Parser. Вот что я делаю

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); 
     } 
} 

Будет ли эта логика работать? Если нет, как я должен извлекать встроенные данные HTML из XML с помощью SAX Parser.

+0

Откуда берутся 'timeLine' и' tempStr'? –

+0

@ The Elite Gentleman отредактирован для поддержки переменных req. –

ответ

1

Вы можете разобрать HTML после всех HTML также xml.There является ссылка похожа на это в stackoverflow.You может попробовать этот How to parse the html content in android using SAX PARSER

+0

(В общем случае это неверно, что «html также является xml», даже если он в этом контексте.) –

+0

+1: принятый ответ на этот вопрос - это самый простой способ справиться с этим. –

+0

HTML * так * полностью не XML. Парсер SAX умирает, если вы передаете его img или p-тегам без закрытия ..., который является допустимым HTML, если не действителен XHTML. – mjfgates

0

Если HTML фактически XHTML, вы можете разобрать его с помощью SAX и извлечь xhtml содержимого тега <content>, но не так легко.

Вам нужно будет заставить обработчик фактически реагировать на события, которые будут подняты всеми тегами xhtml внутри тега <content>, и либо создать что-то похожее на структуру DOM, которое затем можно было бы сериализовать обратно в xml-форму, или «на лету» непосредственно записывать в буфере строки xml, реплицируя содержимое.

Если вы изменили свой xml так, чтобы html внутри тега содержимого был обернут в элемент CDATA, как предлагается в How to parse the html content in android using SAX PARSER, что-то не слишком далеко от вашего кода действительно должно работать.

Но вы не можете просто поместить содержимое в свою переменную String tempStr в методе characters, как вы это делаете. Вам понадобится метод startElement, который инициализирует буфер для строки при просмотре тега <content>, собирает в этот буфер в методе characters и помещает результат где-то в endElement для тега <content>.

1

Элемент пуска, Если элемент является содержимым, ваш temp Str-буфер должен быть инициализирован. else, если контент уже запущен, захватить текущий элемент запуска и его атрибуты и обновить его до буфера temp Str.

В случае символов, , если содержимое запущено, добавьте charecters в текущий буфер.

Оконечный элемент Если содержимое запущено, запишите конечный узел и добавьте в буфер строки.

Мой Допущение:

XML-будет иметь только один тег контента.

+0

+ !: Перепишите этот комментарий на перечитайте. Да, я думаю, что это будет работать как обработка строки xml на лету, на которую я ссылался в своем ответе. И это красивое краткое описание. –

0

я найти решение в этом случае:

Примечание: В этом решении я хочу получить содержимое HTML между <chapter> тегами (<chapter> ... html content ... </chapter>)

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; 

     } 

    }; 

Обновление:

Мой код есть Жук.потому что длина ch [] в DocumentHandler варьируется в различной ситуации!

Смежные вопросы