我尝试从JTextPane获取漂亮(清理)的文本内容。以下是JTextPane
的示例代码:
JTextPane textPane = new JTextPane ();
textPane.setContentType ("text/html");
textPane.setText ("This <b>is</b> a <b>test</b>.");
String text = textPane.getText ();
System.out.println (text);
JTexPane
中的文字如下所示:
这 测试。
我得到这种打印到控制台:
<html>
<head>
</head>
<body>
This <b>is</b> a <b>test</b>.
</body>
</html>
我使用了substring()
和/或replace()
代码,但使用起来很不舒服:
String text = textPane.getText ().replace ("<html> ... <body>\n , "");
是否有任何简单的函数可以从字符串中删除除<b>
标记(内容)之外的所有其他标记?
有时JTextPane
会在内容周围添加<p>
个标签,所以我也想摆脱它们。
像这样:
<html>
<head>
</head>
<body>
<p style="margin-top: 0">
hdfhdfgh
</p>
</body>
</html>
我想只获得带有标签的文字内容:
This <b>is</b> a <b>test</b>.
答案 0 :(得分:5)
我已将HTMLWriter
隐藏,并覆盖startTag
和endTag
以跳过<body>
之外的所有标记。
我没有测试太多,似乎工作正常。一个缺点是输出字符串有很多空白。摆脱它应该不会太难。
import java.io.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
public class Foo {
public static void main(String[] args) throws Exception {
JTextPane textPane = new JTextPane();
textPane.setContentType("text/html");
textPane.setText("<p>This</p> <b>is</b> a <b>test</b>.");
StringWriter writer = new StringWriter();
HTMLDocument doc = (HTMLDocument) textPane.getStyledDocument();
HTMLWriter htmlWriter = new OnlyBodyHTMLWriter(writer, doc);
htmlWriter.write();
System.out.println(writer.toString());
}
private static class OnlyBodyHTMLWriter extends HTMLWriter {
public OnlyBodyHTMLWriter(Writer w, HTMLDocument doc) {
super(w, doc);
}
private boolean inBody = false;
private boolean isBody(Element elem) {
// copied from HTMLWriter.startTag()
AttributeSet attr = elem.getAttributes();
Object nameAttribute = attr
.getAttribute(StyleConstants.NameAttribute);
HTML.Tag name = null;
if (nameAttribute instanceof HTML.Tag) {
name = (HTML.Tag) nameAttribute;
}
return name == HTML.Tag.BODY;
}
@Override
protected void startTag(Element elem) throws IOException,
BadLocationException {
if (inBody) {
super.startTag(elem);
}
if (isBody(elem)) {
inBody = true;
}
}
@Override
protected void endTag(Element elem) throws IOException {
if (isBody(elem)) {
inBody = false;
}
if (inBody) {
super.endTag(elem);
}
}
}
}
答案 1 :(得分:1)
您可以使用JEditorPane自己使用的HTML解析器HTMLEditorKit.ParserDelegator
。
答案 2 :(得分:0)
我通过使用substring和replace -methods找到了解决这个问题的方法:
// Get textPane content to string
String text = textPane.getText();
// Then I take substring to remove tags (html, head, body)
text = text.substring(44, text.length() - 19);
// Sometimes program sets <p style="margin-top: 0"> and </p> -tags so I remove them
// This isn't necessary to use.
text = text.replace("<p style=\"margin-top: 0\">\n ", "").replace("\n </p>", ""));
// This is for convert possible escape characters example & -> &
text = StringEscapeUtils.unescapeHtml(text);
有StringEscapeUtils -libraries的链接,它将转义字符转换回普通视图。感谢Ozhan Duz提出的建议。
(commons-lang - download)
答案 3 :(得分:0)
String text = textPane.getDocument.getText (0,textPane.getText().length());