Java从元素获取文本内容以包含换行符

时间:2014-11-22 13:10:17

标签: java html javafx javafx-webengine

我从Element({1}}(JavaFX)的Document获得WebEngine,并使用body元素中的getTextContent()函数获取文本内容。 body元素具有属性contenteditable="true",因此我可以在其上书写。但是,从getTextContent()返回的字符串不包含换行符。所以

Line 1
Line 2
Line 3

在身体上会返回Line 1Line 2Line 3我需要它包含换行符。我怎么能这样做呢?

或者,如果我能找到一种方法来设置每个角色的样式,我可以使用<TextArea>代替<body contenteditable="true"。但我不知道如何。

感谢。

1 个答案:

答案 0 :(得分:1)

后续行将作为<div>元素子元素的新<body>元素插入到html中。

您可以通过执行javascript代码段来查看HTML内容:

String html = (String)webView.getEngine()
    .executeScript("document.documentElement.innerHTML");

要获取各个行,您需要遍历<body>个子节点。这是一个例子:

import java.util.ArrayList;
import java.util.List;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class EditableWebView extends Application {

    @Override
    public void start(Stage primaryStage) {
        WebView webView = new WebView();
        webView.getEngine().loadContent(
            "<html><body contentEditable=\"true\"></body></html>");

        Button contentButton = new Button("Show content");
        contentButton.setOnAction(e -> {
            List<String> lines = new ArrayList<>();

            Node body = webView.getEngine()
                    .getDocument()
                    .getElementsByTagName("body")
                    .item(0);
            NodeList childNodes = body.getChildNodes();
            for (int i=0; i<childNodes.getLength(); i++) {
                lines.add(childNodes.item(i).getTextContent());
            }

            lines.forEach(System.out::println);

        });

        Button htmlButton = new Button("Show HTML");
        htmlButton.setOnAction(e -> 
            System.out.println(webView.getEngine()
                    .executeScript("document.documentElement.innerHTML")));

        HBox buttons = new HBox(5, contentButton, htmlButton);

        BorderPane root = new BorderPane(webView, null, null, buttons, null);
        Scene scene = new Scene(root, 600, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

如果您需要其他选项来创建可设置样式的可编辑文本,请查看RichTextFX