实体被引用但未被声明
项目中有转PDF的操作,使用的是fremark的ftl文件进行解析,但是当文本中含有特殊符号如:& .解析就会报错,后面查了一下说是需要转义成 类似 & 这样的符号才能被html识别,于是查了一下,将常见的特殊符号进行了转义,代码如下:
/**
* 将字符串中的XML特殊字符转义
* & -> &
* < -> <
* > -> >
* " -> "
* ' -> '
* · -> ·
* **/
public static String covertXML(String content) {
char[] originContentChars = content.toCharArray();
int finalContentCharLength = 0;//转义后字符串长度
for (char contentChar : originContentChars) {
switch (contentChar) {
case '&':
finalContentCharLength = finalContentCharLength + 5;
continue;
case '"':
case '\'':
case '·':
finalContentCharLength = finalContentCharLength + 6;
continue;
case '<':
case '>':
finalContentCharLength = finalContentCharLength + 4;
continue;
default:
finalContentCharLength = finalContentCharLength + 1;
}
}
char[] newContentChars = new char[finalContentCharLength];
int newContentCharsPos = 0;
for (char originContentChar : originContentChars) {
switch (originContentChar) {
case '&':
//& -> &
newContentChars[newContentCharsPos] = '&';
newContentChars[newContentCharsPos + 1] = 'a';
newContentChars[newContentCharsPos + 2] = 'm';
newContentChars[newContentCharsPos + 3] = 'p';
newContentChars[newContentCharsPos + 4] = ';';
newContentCharsPos += 5;
continue;
case '"':
//" -> "
newContentChars[newContentCharsPos] = '&';
newContentChars[newContentCharsPos + 1] = 'q';
newContentChars[newContentCharsPos + 2] = 'u';
newContentChars[newContentCharsPos + 3] = 'o';
newContentChars[newContentCharsPos + 4] = 't';
newContentChars[newContentCharsPos + 5] = ';';
newContentCharsPos += 6;
continue;
case '\'':
//' -> '
newContentChars[newContentCharsPos] = '&';
newContentChars[newContentCharsPos + 1] = 'a';
newContentChars[newContentCharsPos + 2] = 'p';
newContentChars[newContentCharsPos + 3] = 'o';
newContentChars[newContentCharsPos + 4] = 's';
newContentChars[newContentCharsPos + 5] = ';';
newContentCharsPos += 6;
continue;
case '·':
//· -> ⋅;
newContentChars[newContentCharsPos] = '&';
newContentChars[newContentCharsPos + 1] = 's';
newContentChars[newContentCharsPos + 2] = 'd';
newContentChars[newContentCharsPos + 3] = 'o';
newContentChars[newContentCharsPos + 4] = 't';
newContentChars[newContentCharsPos + 5] = ';';
newContentCharsPos += 6;
continue;
case '<':
//< -> <
newContentChars[newContentCharsPos] = '&';
newContentChars[newContentCharsPos + 1] = 'l';
newContentChars[newContentCharsPos + 2] = 't';
newContentChars[newContentCharsPos + 3] = ';';
newContentCharsPos += 4;
continue;
case '>':
//> -> >
newContentChars[newContentCharsPos] = '&';
newContentChars[newContentCharsPos + 1] = 'g';
newContentChars[newContentCharsPos + 2] = 't';
newContentChars[newContentCharsPos + 3] = ';';
newContentCharsPos += 4;
continue;
default:
newContentChars[newContentCharsPos] = originContentChar;
newContentCharsPos++;
}
}
return new String(newContentChars);
}
但是,其他的都没问题,就间隔号有问题,依旧解析不了,查了一下,间隔号有对应,·,⋅但是都不起作用,后来想了想是不是flt文件,也就是对应的html就有问题,于是打开看了一下,果然,自己的ftl文件缺少html的doctype标识,将<html>改成如下,问题得以解决
<!DOCTYPE html>
<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org">