2009-12-07 43 views
7

Trong đơn đăng ký của tôi, tôi sử dụng JTextPane để hiển thị một số thông tin nhật ký. Khi tôi muốn chiếu sáng một số dòng cụ thể trong văn bản này (ví dụ: thông báo lỗi), tôi đặt contentType là "text/html". Bằng cách này, tôi có thể định dạng văn bản của mình.Lấy văn bản thô từ JTextPane

Bây giờ, tôi tạo một JButton sao chép nội dung của JTextPane này vào khay nhớ tạm. phần đó là dễ dàng, nhưng vấn đề của tôi là khi tôi gọi myTextPane.getText(), tôi lấy mã HTML, chẳng hạn như:

<html> 
    <head> 

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

thay vì nhận được chỉ có nội dung thô:

blabla 
foobar 
blabla 

Có cách nào để chỉ lấy nội dung của JTextPane trong văn bản thuần túy? Hay tôi có cần chuyển HTML thành văn bản thô không?

Trả lời

5

Dựa trên câu trả lời chấp nhận: 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()); 

phiên bản sửa đổi Hơi của lớp Html2Text tìm thấy trên các câu trả lời tôi liên kết với

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

Nếu bạn cần một xử lý hạt mịn hơn xem xét triển khai nhiều giao diện được xác định bởi HTMLEditorKit.ParserCallback

2

Bạn không cần phải tự làm. Hãy tưởng tượng nếu một số nội dung là HTML cụ thể, ví dụ như hình ảnh - biểu diễn văn bản không rõ ràng. Bao gồm văn bản thay thế hoặc không phải là ví dụ.

2

(Is RegExp phép? Đây không phải là phân tích cú pháp, không phải là nó)

Lấy kết quả gettext() và sử dụng String.replaceAll() để lọc tất cả các thẻ. Hơn một trim() để loại bỏ các khoảng trống đầu và cuối. Đối với các khoảng trắng giữa lần đầu tiên của bạn và bạn 'blabla' cuối cùng, tôi không thấy giải pháp chung. Có lẽ bạn có thể đổ phần còn lại xung quanh CRLF và cắt tất cả các chuỗi một lần nữa.

(Tôi không phải chuyên gia regexp - có lẽ ai đó có thể cung cấp các regexp và kiếm được một số danh tiếng;))

Sửa

.. Tôi chỉ là giả định rằng bạn không sử dụng <> trong văn bản của bạn - nếu không nó .. nói, đó là một thách thức.

16

Không cần sử dụng ParserCallback. Chỉ cần sử dụng:

textPane.getDocument().getText(0, textPane.getDocument().getLength())); 
+0

Đó thực sự là một giải pháp thực sự tốt ... ngoại trừ việc tôi mất tất cả các ngắt dòng, và sau đó chuỗi cuối cùng của tôi chỉ là một dòng. Quá tệ, bởi vì tôi thực sự thích giải pháp này! – romaintaz

+0

Có, Tài liệu không lưu trữ ngắt dòng, chúng được thêm bằng giải pháp khác theo cách thủ công. – camickr

Các vấn đề liên quan