Unmarshall期间无效的XML字符

我使用编码“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 = 0x20) && (c = 0xE000) && (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类有问题吗?

Unicode字符U + 001A 在XML 1.0中是非法的 :

在这种情况下,用于表示它的编码无关紧要,在XML内容中根本不允许。

XML 1.1允许包含一些受限制的字符 (包括U + 001A),但它们必须作为数字字符引用存在( 

维基百科对这种情况有一个很好的总结 。

我认为主要问题是在编组过程中逃避非法字符 。 这里提到类似的东西,你可以尝试一下。

它提供了将编码更改为Unicode marshaller.setProperty("jaxb.encoding", "Unicode");