我从java应用程序的SQL查询生成pdf。 我有4M pdf可以打印。
在15092th pdf。 我遇到了这个错误
Invalid xml character (unicode 0xc) was found in the element content of the document
我试图像其他博客所说的那样替换。
html = html.replaceAll("\000"," ");
html = html.replaceAll("/\u000c+/g", "");
我不知道我把它们放在我的html中是哪一个。
有想法的人吗?
谢谢!
答案 0 :(得分:1)
有几种方法可以替换。我更详细地描述它们,因为我认为理解它们更重要,而不仅仅是复制代码。
一个简单的逐字符替换。这适用于您的情况,因为您只想替换某个字符的出现。由于你的角色是一个控制角色,你不能(通常)直接插入它,但是通过以下方式之一:
html=html.replace('\u000c', ' '); // hexadecimal value == 0xc
html=html.replace('\14', ' '); // 0xc == 014
html=html.replace('\f', ' '); // character 0xc is a form-feed
Unicode引用有点棘手,因为它们是在Java解析器之前处理的,因此它们不适用于具有Java语言特殊含义的字符。但是使用换页符号就可以了。
使用正则表达式。对于此任务,这是一个过大的解决方案,但它的作用是执行单个字符的精确匹配是正则表达式语法的有效子集。因此,您可以使用所有上述变体并通过将方法名称替换为replaceAll
来构建基于正则表达式的解决方案,并将参数更改为字符串,例如html=html.replaceAll("\14", " ");
在这种情况下,字符引用仍然由编译器生成,并且对正则表达式引擎没有特殊含义。
主动使用正则表达式引擎时,您对Java语言的字符引用有类似的选择:
html=html.replaceAll("\\u000c", " ");
html=html.replaceAll("\\x0c", " "); // no Java equivalent
html=html.replaceAll("\\014", " "); // note the subtle difference
html=html.replaceAll("\\f", " ");
不同之处在于这些序列在Java语言级别(通过 double-backslash )插入反斜杠,形成由正则表达式引擎处理的正则表达式。因此,Unicode引用适用于此处的所有字符。 这里描述了整个语法: http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
但正如你已经说过的那样,简单的字符匹配就足够了。
为什么你的例子不起作用?
html = html.replaceAll("\000"," ");
序列\0
被解释为对控制字符0x0的引用,后面跟着两个零。因此,它试图找到控制字符NUL
的序列,后跟两个零。
html = html.replaceAll("/\u000c+/g", "");
此序列由字符'/'
'\f'
(通过正确的unicode序列定义)'+'
'/'
'g'
组成。只有加号在Java中的正则表达式中具有特殊含义。它意味着“至少一个”和“尽可能多的”。因此,此代码会查找您的角色0xc的序列,但前提是它们由斜杠构成,后跟'g'
。