Java 防止Jsoup丢弃额外的空白

Java 防止Jsoup丢弃额外的空白,java,jsoup,Java,Jsoup,我正在使用Jsoup清理表单中的用户输入。该表单包含一个需要纯文本的。提交表单时,我用Jsoup.clean(textareaContents)清理输入;但是,由于html忽略了额外的空格,Jsoup.clean()将从输入中删除有价值的空格字符 例如,如果有人在文本区域中输入了几行文本: hello test 在Jsoup.clean()之后,您将有: hello test 如何使Jsoup.clean()保留空白?我知道它是为解析html而设计的,而这不是html,所以有更好的选择吗?

我正在使用Jsoup清理表单中的用户输入。该表单包含一个需要纯文本的
。提交表单时,我用
Jsoup.clean(textareaContents)
清理输入;但是,由于html忽略了额外的空格,
Jsoup.clean()
将从输入中删除有价值的空格字符

例如,如果有人在
文本区域
中输入了几行文本:

hello

test
Jsoup.clean()之后,您将有:

hello test

如何使
Jsoup.clean()
保留空白?我知道它是为解析html而设计的,而这不是html,所以有更好的选择吗?

如果您的textarea只需要纯文本,那么我认为您最好只使用html来转义纯文本。即,将用户输入的
标记分别转换为
。无论是输入还是输出(输入可能更安全,所以您只需考虑一次)


正如您所说,设计用于解析不受信任的输入HTML和输出受信任的HTML,其中使用元素进行格式化。

对于后代,如果您仍然需要使用空格访问原始文本,可以使用方法

示例代码:

/**
 * @param cell element that contains whitespace formatting
 * @return
 */
public static String getText(Element cell) {
    String text = null;
    List<Node> childNodes = cell.childNodes();
    if (childNodes.size() > 0) {
        Node childNode = childNodes.get(0);
        if (childNode instanceof TextNode) {
            text = ((TextNode)childNode).getWholeText();
        }
    }
    if (text == null) {
        text = cell.text();
    }
    return text;
}
/**
*@param单元格元素,包含空格格式
*@返回
*/
公共静态字符串getText(元素单元格){
字符串文本=空;
List childNodes=cell.childNodes();
if(childNodes.size()>0){
Node childNode=childNodes.get(0);
if(文本节点的子节点实例){
text=((TextNode)childNode.getWholeText();
}
}
if(text==null){
text=cell.text();
}
返回文本;
}

在上面的代码中,我们假设传入的元素直接在元素体中包含文本内容(我们使用第一个节点)。如果不是这样,它将回到常规方法。

Neeme Praks的回答非常好,正确地保留了空白。然而,内联HTML确实把事情搞砸了

<span>This is<br />some text.  Cool story.</span>
或者,如果传入一个没有自己文本的元素,它将返回null

因此,为了我的目的,我不得不对该方法进行一些修改。这可能会帮助一些人,所以我把它贴在这里。基本思想是迭代子对象,而不是只取第一个。这还包括一个获取没有子元素的任何元素的HTML的案例

这样,原始代码段将返回:

This is<br />some text.  Cool story.

我有一个类似的不寻常的用例,其中空格很重要,文本中添加了

标记。我放弃了你的方法,现在一切都很好(在过去两天花了几个小时在这上面)。感谢您花时间发布您的方法。为什么有textBuilder.append(node.outerHtml());?这将复制标记的内容。ie“hello>”将变成“hellohello”。我错过什么了吗?
This is<br />some text.  Cool story.
public static String getText(Element cell) {
    StringBuilder textBuilder = new StringBuilder();
    for (Node node : cell.childNodes()) {
        if (node instanceof TextNode) {
            textBuilder.append(((TextNode)node).getWholeText());
        }
        else {
            for (Node childNode : node.childNodes()) {
                textBuilder.append(getText((Element)childNode));
            }
            textBuilder.append(node.outerHtml());
        }
    }
    if (cell.childNodes().isEmpty()) {
        textBuilder.append(cell.outerHtml());
    }
    return textBuilder.toString();
}