SAX Parser: извлечение тегов HTML из XML - PullRequest
2 голосов
/ 05 января 2011

У меня есть 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.

Ответы [ 4 ]

1 голос
/ 05 января 2011

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

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

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

Мое предположение:

В xml будет только один тег содержимого.

1 голос
/ 05 января 2011

Вы можете разобрать html после того, как все html также xml. Есть ссылка, подобная этой в stackoverflow. Вы можете попробовать это Как проанализировать html-контент в Android с помощью SAX PARSER

0 голосов
/ 02 октября 2011

Я нахожу решение следующим образом:

Примечание: В этом решении я хочу получить 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 варьируется в разных ситуациях!

0 голосов
/ 05 января 2011

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

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

Если вы измените свой xml так, чтобы html внутри тега содержимого был обернут в элемент CDATA, как предложено в Как анализировать HTML-контент в Android с помощью SAX PARSER , что-то не слишком далеко от вашего кода действительно должно работать.

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

...