【问题标题】:How to only load text contents into JTextPane that are within the <body> tags?如何仅将文本内容加载到 <body> 标记内的 JTextPane 中?
【发布时间】:2020-03-21 03:16:04
【问题描述】:

现在,我在Java Swing 中有一个JTextPane,它将文件中的内容加载到窗格中。但是,它会加载包括所有标签在内的所有内容。我希望它只加载内容。有没有办法获取标签并加载&lt;body&gt;&lt;/body&gt; 之间的部分?

这里是代码

public class LoadContent {

String path = "../WordProcessor_MadeInSwing/backups/testDir/cool_COPY3.rtf";

public void load(JTextPane jTextPane){
    try {
        FileReader fr = new FileReader(path);
        BufferedReader reader = new BufferedReader(fr);
        jTextPane.read(reader, path);

    } catch (FileNotFoundException ex) {
        ex.printStackTrace();
    }
    catch(IOException e){

    }
}

}

如果我的.rtf 文件包含“这是一个测试”一词,它将加载为:

<html>
  <head>
    <style>
      <!--
        p.default {
          family:Dialog;
          size:3;
          bold:normal;
          italic:;
          foreground:#333333;
        }
      -->
    </style>
  </head>
  <body>
    <p class=default>
      <span style="color: #333333; font-size: 12pt; font-family: Dialog">
        Here is a test
      </span>
    </p>
  </body>
</html>

我只希望它加载“这是一个测试”

【问题讨论】:

  • 我所知道的 Swing API 中没有任何东西可以做你想做的事。由于您正在处理 HTML,我认为 HTML 解析器是您提取所需 HTML 文本部分所需要的。 jsoup 是一个 java HTML 解析器。

标签: java swing jtextpane reader


【解决方案1】:

我希望它只加载内容

那么你需要先解析出内容,然后再显示文本。

这里有一个简单的例子来显示Span标签之间的文本:

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

class GetSpan
{
    public static void main(String[] args)
        throws Exception
    {
        // Create a reader on the HTML content

        Reader reader = getReader( args[0] );

        // Parse the HTML

        EditorKit kit = new HTMLEditorKit();
        HTMLDocument doc = (HTMLDocument)kit.createDefaultDocument();
        doc.putProperty("IgnoreCharsetDirective", Boolean.TRUE);
        kit.read(reader, doc, 0);

        // Find all the Span elements in the HTML document

        HTMLDocument.Iterator it = doc.getIterator(HTML.Tag.SPAN);

        while (it.isValid())
        {
            int start = it.getStartOffset();
            int end = it.getEndOffset();
            String text = doc.getText(start, end - start);
            System.out.println(  text );
            it.next();
        }
    }

    // If 'uri' begins with "http:" treat as a URL,
    // otherwise, treat as a local file.
    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);
        }
    }
}

只需使用您的文件作为参数运行该类。

编辑:

刚刚注意到问题已更改为在 &lt;body&gt; 标记而不是 &lt;span&gt; 标记中查找文本。由于某种原因,没有为 &lt;body&gt; 标记返回迭代器。

所以另一种选择是使用ParserCallback。每次找到开始标签(或结束标签)或找到任何标签的文本时,回调都会通知您。

一个基本的例子是:

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

public class ParserCallbackText extends HTMLEditorKit.ParserCallback
{
    private boolean isBody = false;

    public void handleText(char[] data, int pos)
    {
        if (isBody)
            System.out.println( data );
    }

    public void handleStartTag(HTML.Tag tag, MutableAttributeSet a, int pos)
    {
        if (tag.equals(HTML.Tag.BODY))
        {
            isBody = true;
        }
    }

    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);
        }
    }
}

上面的示例将忽略找到&lt;head&gt; 标记的任何文本。

【讨论】:

    【解决方案2】:

    尝试使用 HTML 解析器。 jsoup 很不错,而且非常易于使用。

      public static String extractText(Reader reader) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader br = new BufferedReader(reader);
        String line;
        while ( (line=br.readLine()) != null) {
          sb.append(line);
        }
        String textOnly = Jsoup.parse(sb.toString()).text();
        return textOnly;
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多