oli*_*ood 10 java jaxb xml-serialization unmarshalling
我使用编码"UTF-8"将对象编组到XML文件.它成功生成文件.但是当我试图将其解组时,会出现错误:
在属性"{1}"的值中找到无效的XML字符(Unicode:0x {2}),元素为"0"
字符为0x1A或\ u001a,在UTF-8中有效,但在XML中是非法的.JAXB中的Marshaller允许将此字符写入XML文件,但Unmarshaller无法解析它.我试图使用另一种编码(UTF-16,ASCII等),但仍然是错误.
常见的解决方案是在XML解析之前删除/替换此无效字符.但是,如果我们需要这个角色,如何在解组之后获得原始角色?
在寻找此解决方案时,我想在解组之前用替换字符(例如dot =".")替换无效字符.
我创建了这个类:
public class InvalidXMLCharacterFilterReader extends FilterReader {
public static final char substitute = '.';
public InvalidXMLCharacterFilterReader(Reader in) {
super(in);
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
int read = super.read(cbuf, off, len);
if (read == -1)
return -1;
for (int readPos = off; readPos < off + read; readPos++) {
if(!isValid(cbuf[readPos])) {
cbuf[readPos] = substitute;
}
}
return readPos - off + 1;
}
public boolean isValid(char c) {
if((c == 0x9)
|| (c == 0xA)
|| (c == 0xD)
|| ((c >= 0x20) && (c <= 0xD7FF))
|| ((c >= 0xE000) && (c <= 0xFFFD))
|| ((c >= 0x10000) && (c <= 0x10FFFF)))
{
return true;
} else
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
然后这就是我读取和解组文件的方式:
FileReader fileReader = new FileReader(this.getFile());
Reader reader = new InvalidXMLCharacterFilterReader(fileReader);
Object o = (Object)um.unmarshal(reader);
Run Code Online (Sandbox Code Playgroud)
不知何故,读者不会用我想要的字符替换无效字符.它导致错误的XML数据无法解组.我的InvalidXMLCharacterFilterReader类有问题吗?
| 归档时间: |
|
| 查看次数: |
17942 次 |
| 最近记录: |