代码之家  ›  专栏  ›  技术社区  ›  Romain Linsolas

从jTextPane获取原始文本

  •  7
  • Romain Linsolas  · 技术社区  · 15 年前

    在我的应用程序中,我使用 JTextPane 显示一些日志信息。因为我想突出显示此文本中的某些特定行(例如错误消息),所以我设置了 contentType 作为“ text/html “。这样,我可以格式化文本。

    现在,我创建一个复制此内容的jbutton 文本窗格 放入剪贴板。那部分很容易,但我的问题是当我打电话的时候 myTextPane.getText() ,我得到HTML代码,例如:

    <html>
      <head>
    
      </head>
      <body>
        blabla<br>
        <font color="#FFCC66"><b>foobar</b></font><br>
        blabla
      </body>
    </html>
    

    而不是只获取原始内容:

    blabla
    foobar
    blabla
    

    有没有办法只得到我的 文本窗格 用纯文本?还是我需要自己将HTML转换成原始文本?

    4 回复  |  直到 15 年前
        1
  •  5
  •   Community CDub    7 年前

    根据接受的回答: Removing HTML from a Java String

    MyHtml2Text parser = new MyHtml2Text();
    try {
        parser.parse(new StringReader(myTextPane.getText()));
    } catch (IOException ee) {
      //handle exception
    }
    System.out.println(parser.getText());
    

    稍微修改的版本 Html2Text 在我链接到的答案上找到的类

    import java.io.IOException;
    import javax.swing.text.html.*;
    import javax.swing.text.html.parser.*;
    
    public class MyHtml2Text extends HTMLEditorKit.ParserCallback {
        StringBuffer s;
        public MyHtml2Text() {}
        public void parse(Reader in) throws IOException {
            s = new StringBuffer();
            ParserDelegator delegator = new ParserDelegator();
            delegator.parse(in, this, Boolean.TRUE);
        }
        public void handleText(char[] text, int pos) {
            s.append(text);
            s.append("\n");
        }
        public String getText() {
            return s.toString();
        }
    }
    

    如果需要更细粒度的处理,请考虑实现由 HTMLEditorKit.ParserCallback

        2
  •  16
  •   camickr    15 年前

    不需要使用ParserCallback。只需使用:

    textPane.getDocument().getText(0, textPane.getDocument().getLength()) );
    
        3
  •  2
  •   Nick Fortescue    15 年前

    不幸的是,你需要自己去做。想象一下,如果某些内容是特定于HTML的,例如图像,那么文本表示就不清楚了。例如,是否包含alt文本。

        4
  •  2
  •   Andreas Dolk    15 年前

    (是否允许regexp?这不是解析,不是吗)

    获取getText()结果并使用string.replaceAll()筛选所有标记。而不是trim()来删除前导空格和尾随空格。对于第一个和最后一个“blabla”之间的空白,我看不出通用的解决方案。也许你可以把剩余的部分撒在CRLF上,然后重新修剪所有的字符串。

    (我不是regexp专家-也许有人可以提供regexp并获得一些声誉;)

    编辑

    …我只是假设你不使用 < > 在你的文本中-否则…说,这是一个挑战。