本文目录导读:

我来帮你了解 JEditorPane、HTMLEditorKit 和 ParserCallback 中有关结束处理(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解析完成 === 标题第一段第二段
关键点
- handleEndTag 是处理结束标签的核心方法
- HTML.Tag 参数标识标签类型
- int pos 参数表示标签位置
- 可以根据不同标签执行不同逻辑
- 常用于验证HTML结构、提取内容等操作
这样你就可以在 HTML 解析过程中对结束标签进行相应的处理了。