java - 如何在 wffweb 中正确呈现 HTML 树中的任意文本内容
问题描述
以下 wffweb java 代码(相对接近wffweb网站上提供的示例):
html = new Html(null) {{
new Head(this) {{
new TitleTag(this) {{
new NoTag(this, "No <tags> inside, please!");
}};
}};
}};
System.out.println(html.toHtmlString());
打印出来:
<html><head><title>No <tags> inside, please!</title></head></html>
我期望(并且需要)是使用相应的机制(在这种情况下<tags>
应该是)转义文本节点内的任何 XML 字符。<tags>
在输出中转义文本节点内的 XML 语法的正确(或推荐)方法是什么?我显然可以在添加字符串之前自己包装 XML 语法,但这听起来不对,我不应该每次都转义/取消转义文本节点值,我希望它们作为常规字符串存储在树中,并且仅在序列化期间修改。
解决方案
可以借助commons-textorg.apache.commons.text.StringEscapeUtils.escapeHtml4
中的方法来实现。
这是我的XmlUtil
课:
import org.apache.commons.text.StringEscapeUtils;
public class XmlUtil {
//using StringEscapeUtils.escapeHtml4
public static String convertSymbolsToEntityChars(String text) {
return StringEscapeUtils.escapeHtml4(text);
}
public static void main(String[] args) {
System.out.println(convertSymbolsToEntityChars("No <tags> inside, please!"));
}
}
如果您运行该main
方法,它将打印No <tags> inside, please!
如果您更喜欢jsoup方式,ENTITIES_STRING
如果您希望支持更多实体字符,则必须更新。
所以你的最终代码将如下所示:
html = new Html(null) {{
new Head(this) {{
new TitleTag(this) {{
new NoTag(this, XmlUtil.convertSymbolsToEntityChars("No <tags> inside, please!", true));
}};
}};
}};
System.out.println(html.toHtmlString());
现在将打印:
<html><head><title>No <tags> inside, please!</title></head></html>
请注意,它NoTag
支持纯文本和 HTML。
new NoTag(this, "No <tags> inside, please!");
等于
//constructor params = (parent, content, contentTypeHtml)
new NoTag(this, "No <tags> inside, please!", false);
因此,如果您传递的内容应该被视为 HTML,那么new NoTag(this, "No <tags> inside, please!", true);
这是推荐的方式。
从最新版本的wffweb 开始,建议使用功能样式编码而不是匿名样式编码。例如:
Html rootTag = new Html(null).give(html -> {
new Head(html).give(head -> {
new TitleTag(head).give(title -> {
new NoTag(title, "No <tags> inside, please!", true);
});
});
});
System.out.println(rootTag.toHtmlString());
如果您只想显示No <tags> inside, please!
bytoHtmlString
但又想从中获取原始未转换的字符串,TitleTag
则可以使用SharedTagContent<String>
而不是NoTag
. 观看有关其用法的视频。
例如:
SharedTagContent<String> titleSTC = new SharedTagContent<>("No <tags> inside, please!", true);
Html rootTag = new Html(null).give(html -> {
new Head(html).give(head -> {
new TitleTag(head).give(title -> {
title.subscribeTo(titleSTC, content -> {
String innerText = content.getContent();
if (innerText != null && content.isContentTypeHtml()) {
String contentHavingEntityCharacters = XmlUtil.convertSymbolsToEntityChars(innerText);
return new SharedTagContent.Content<>(contentHavingEntityCharacters, content.isContentTypeHtml());
}
return content;
});
});
});
});
System.out.println("rootTag.toHtmlString() = " + rootTag.toHtmlString());
System.out.println("titleSTC.getContent() = " + titleSTC.getContent());
//to get unconverted text from TitleTag
TitleTag titleTag = TagRepository.findOneTagAssignableToTag(TitleTag.class, rootTag);
String titleTagInnerContent = (String) titleTag.getSharedTagContent().getContent();
System.out.println("titleTagInnerContent = " + titleTagInnerContent);
它打印
rootTag.toHtmlString() = <html><head><title>No <tags> inside, please!</title></head></html>
titleSTC.getContent() = No <tags> inside, please!
titleTagInnerContent = No <tags> inside, please!
推荐阅读
- c# - 如何将 c# 单元测试作为独立的控制台程序?(没有外部跑步者或控制台)
- laravel - $trigger - 错误
在 Laravel 微风 - javascript - 基于可区分联合的缩小打字稿泛型类型
- reactjs - 在 React Native 中更改先前状态的样式属性
- python - 如何处理 TypeError:不支持的操作数类型 -: 'list' 和 'list'
- settings - 在 Protégé 中,僧伽罗语 Unicode 不起作用。需要一个方向来纠正它
- r - 如何在R中的一个图中绘制多个直方图
- regex - 正则表达式:仅在字符串末尾匹配,而不是弹性中的任何位置
- docker - 如何通过 docker autodiscover 使用自定义摄取管道
- python - 在 django 中管理空闲和忙碌的约会