Как очистить HTML-содержимое JTextPanes / JEditorPanes в строку в Java? - PullRequest
2 голосов
/ 31 марта 2011

Я пытаюсь получить красивый (очищенный) текстовый контент из 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:

Этот является a test .

Я получаю такой тип печати на консоль:

<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>.

Ответы [ 4 ]

5 голосов
/ 01 апреля 2011

Я вложил в подкласс 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 голос
/ 01 апреля 2011

Вы можете использовать анализатор HTML, который JEditorPane использует сам, HTMLEditorKit.ParserDelegator.

См. этот пример и документы API.

0 голосов
/ 11 сентября 2018
String text = textPane.getDocument.getText (0,textPane.getText().length());
0 голосов
/ 31 марта 2011

Я нахожу решение этой проблемы с помощью подстроки и метода замены:

// 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 &amp; -> &
text = StringEscapeUtils.unescapeHtml(text);

Существует ссылка на StringEscapeUtils -libraries, которые преобразуют управляющие символы обратно в обычный вид. Спасибо Ожан Дуз за предложение.

( commons-lang - скачать )

...