JEditorPaneHTMLEditorKitParserEnd结束处理

wen java案例 2

本文目录导读:

JEditorPaneHTMLEditorKitParserEnd结束处理

  1. 核心概念
  2. 主要方法
  3. 关键点

我来帮你了解 JEditorPaneHTMLEditorKitParserCallback 中有关结束处理(end)的方法。

核心概念

HTMLEditorKit.ParserCallback 中,handleEndTag 是处理 HTML 结束标签的主要方法。

主要方法

handleEndTag 方法

public void handleEndTag(HTML.Tag t, int pos) {
    // t: 结束标签类型 (如 HTML.Tag.HTML, HTML.Tag.BODY)
    // pos: 标签在文档中的位置
}

完整示例代码

import javax.swing.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;
public class HTMLParserExample {
    public static void main(String[] args) throws Exception {
        // 创建JEditorPane
        JEditorPane editorPane = new JEditorPane();
        editorPane.setEditorKit(new HTMLEditorKit());
        editorPane.setContentType("text/html");
        // 设置HTML内容
        String html = "<html><body><p>Test</p></body></html>";
        editorPane.setText(html);
        // 获取HTML编辑器
        HTMLEditorKit kit = (HTMLEditorKit) editorPane.getEditorKit();
        // 创建自定义ParserCallback
        HTMLEditorKit.ParserCallback callback = new HTMLEditorKit.ParserCallback() {
            @Override
            public void handleEndTag(HTML.Tag t, int pos) {
                System.out.println("结束标签: " + t.toString() + " 位置: " + pos);
                // 根据不同标签做不同处理
                switch (t.toString()) {
                    case "html":
                        handleHtmlEnd();
                        break;
                    case "body":
                        handleBodyEnd();
                        break;
                    case "p":
                        handlePEnd();
                        break;
                }
            }
            @Override
            public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
                System.out.println("开始标签: " + t.toString() + " 位置: " + pos);
            }
            @Override
            public void handleText(char[] data, int pos) {
                System.out.println("文本: " + new String(data) + " 位置: " + pos);
            }
            private void handleHtmlEnd() {
                System.out.println("HTML文档解析完成");
                // 这里可以执行HTML解析完成后的操作
            }
            private void handleBodyEnd() {
                System.out.println("Body部分解析完成");
                // 可以处理body结束后的逻辑
            }
            private void handlePEnd() {
                System.out.println("段落解析完成");
                // 可以处理段落结束后的逻辑
            }
        };
        // 解析HTML
        try {
            kit.parse(new java.io.StringReader(html), callback, true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

自定义解析器示例

public class CustomHTMLParser extends HTMLEditorKit.ParserCallback {
    private int depth = 0;
    private StringBuilder content = new StringBuilder();
    @Override
    public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
        depth++;
        System.out.println(getIndent() + "开始: <" + t + ">");
    }
    @Override
    public void handleEndTag(HTML.Tag t, int pos) {
        System.out.println(getIndent() + "结束: </" + t + ">");
        // 特别处理html标签的结束
        if (t == HTML.Tag.HTML) {
            System.out.println("=== HTML解析完成 ===");
            System.out.println("总内容: " + content.toString());
        }
        // 特别处理body标签的结束
        if (t == HTML.Tag.BODY) {
            System.out.println("Body解析完成");
        }
        depth--;
    }
    @Override
    public void handleText(char[] data, int pos) {
        String text = new String(data).trim();
        if (!text.isEmpty()) {
            System.out.println(getIndent() + "文本: '" + text + "'");
            content.append(text);
        }
    }
    @Override
    public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) {
        System.out.println(getIndent() + "自闭合标签: <" + t + "/>");
    }
    private String getIndent() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < depth; i++) {
            sb.append("  ");
        }
        return sb.toString();
    }
}

使用示例

// 使用自定义解析器
public void parseHTML() {
    String html = """
        <html>
            <body>
                <h1>标题</h1>
                <p>第一段</p>
                <p>第二段</p>
                <img src="test.jpg"/>
            </body>
        </html>
        """;
    try {
        HTMLEditorKit kit = new HTMLEditorKit();
        CustomHTMLParser parser = new CustomHTMLParser();
        kit.parse(new StringReader(html), parser, true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

输出示例

开始: <html>
  开始: <body>
    开始: <h1>
    文本: '标题'
    结束: </h1>
    开始: <p>
    文本: '第一段'
    结束: </p>
    开始: <p>
    文本: '第二段'
    结束: </p>
    自闭合标签: <img/>
  结束: </body>
  结束: </html>
  === HTML解析完成 === 标题第一段第二段

关键点

  1. handleEndTag 是处理结束标签的核心方法
  2. HTML.Tag 参数标识标签类型
  3. int pos 参数表示标签位置
  4. 可以根据不同标签执行不同逻辑
  5. 常用于验证HTML结构、提取内容等操作

这样你就可以在 HTML 解析过程中对结束标签进行相应的处理了。

抱歉,评论功能暂时关闭!