Почему handleText Swing Parser не обрабатывает вложенные теги?

Мне нужно преобразовать некоторый HTML-текст, который имеет вложенные теги, чтобы украсить "совпадения" атрибутом css, чтобы выделить его (например, поиск в Firefox). Я не могу просто сделать простую замену (например, если пользователь искал "img"), поэтому я пытаюсь просто выполнить замену в основном тексте (не в атрибутах тега).

У меня есть довольно простой HTML-парсер, который, я думаю, должен сделать это:

final Pattern pat = Pattern.compile(srch, Pattern.CASE_INSENSITIVE);
Matcher m = pat.matcher(output);
if (m.find()) {
    final StringBuffer ret = new StringBuffer(output.length()+100);
    lastPos=0;
    try {
        new ParserDelegator().parse(new StringReader(output.toString()),
        new HTMLEditorKit.ParserCallback () {
            public void handleText(char[] data, int pos) {
                ret.append(output.subSequence(lastPos, pos));
                Matcher m = pat.matcher(new String(data));
                ret.append(m.replaceAll("<span class=\"search\">$0</span>"));
                lastPos=pos+data.length;
            }
        }, false);
        ret.append(output.subSequence(lastPos, output.length()));
        return ret;
    } catch (Exception e) {
 return output;
    }
}
return output;

Моя проблема в том, что когда я отлаживаю это, handleText вызывается с текстом, который содержит теги! Это как будто это только один уровень глубины. Кто-нибудь знает почему? Есть ли какая-то простая вещь, которую мне нужно сделать с HTMLParser (не использовал его много), чтобы включить "правильное" поведение вложенных тегов?

PS - сам разобрался - смотри ответ ниже. Короткий ответ: он отлично работает, если вы передадите ему HTML, а не предварительно экранированный HTML. Doh! Надеюсь, это поможет кому-то еще.

<span>example with <a href="#">nested</a> <p>more nesting</p>
</span> <!-- all this gets thrown together -->

2 ответа

Извините за вводящий в заблуждение вопрос - я нашел свою проблему, и она не была включена в мое описание - моя строка ввода была предварительно обработана, поэтому я просматривал такой текст, как

<span>example with &lt;a href="#"&gt; nested &gt;/a&lt; &gt;p&lt;more nesting&gt;/p&lt;
</span> <!-- well of course it all gets thrown together -->

Кажется, работает нормально для меня, используя JDK6 на XP. Я обернул ваш образец HTML тегами head и body. Я получил три строки вывода:

а) пример с б) вложенным в) более вложенным

Вот код, который я использовал:

import java.io.*;
import java.net.*;
import javax.swing.text.html.parser.*;
import javax.swing.text.html.*;

public class ParserCallbackText extends HTMLEditorKit.ParserCallback
{
    public void handleText(char[] data, int pos)
    {
        System.out.println( data );
    }

    public static void main(String[] args)
        throws Exception
    {
        Reader reader = getReader(args[0]);
        ParserCallbackText parser = new ParserCallbackText();
        new ParserDelegator().parse(reader, parser, true);
    }

    static Reader getReader(String uri)
        throws IOException
    {
        // Retrieve from Internet.
        if (uri.startsWith("http:"))
        {
            URLConnection conn = new URL(uri).openConnection();
            return new InputStreamReader(conn.getInputStream());
        }
        // Retrieve from file.
        else
        {
            return new FileReader(uri);
        }
    }
}
Другие вопросы по тегам