【发布时间】:2011-04-28 07:24:52
【问题描述】:
我正在使用编码“UTF-8”将对象编组为 XML 文件。它成功生成文件。但是当我尝试将其解组时,出现错误:
无效的 XML 字符(Unicode: 0x{2}) 的值中发现 属性“{1}”且元素为“0”
字符为 0x1A 或 \u001a,在 UTF-8 中有效但在 XML 中非法。 JAXB 中的 Marshaller 允许将此字符写入 XML 文件,但 Unmarshaller 无法将其解析回来。我尝试使用另一种编码(UTF-16、ASCII 等)但仍然出错。
常见的解决方案是在 XML 解析之前删除/替换这个无效字符。但是如果我们需要这个字符,解组后如何得到原来的字符呢?
在寻找此解决方案时,我想在解组之前用替代字符(例如点 =“.”)替换无效字符。
我已经创建了这个类:
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;
}
}
这就是我读取和解组文件的方式:
FileReader fileReader = new FileReader(this.getFile());
Reader reader = new InvalidXMLCharacterFilterReader(fileReader);
Object o = (Object)um.unmarshal(reader);
不知何故,读者不会用我想要的字符替换无效字符。它会导致无法解组的错误 XML 数据。我的 InvalidXMLCharacterFilterReader 类有问题吗?
【问题讨论】:
-
能否请您检查 XML 标头,编组后在其中定义了哪个字符集?是 UTF-8 吗?
-
XML 标头中没有定义字符集,只有 。但我已经把这个:
m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
标签: java xml-serialization jaxb unmarshalling