本文目录导读:

我来帮你了解 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 解析过程中对结束标签进行相应的处理了。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播