Java 解组过程中的XML字符无效
我使用编码“UTF-8”将对象编组到XML文件。它成功地生成了文件。但当我试图将其解组时,出现了一个错误: 无效的XML字符(Unicode: 在的值中找到0x{2}) 属性“{1}”,元素为“0” 字符为0x1A或\u001a,在UTF-8中有效,但在XML中非法。JAXB中的Marshaller允许将此字符写入XML文件,但解组器无法将其解析回来。我尝试使用另一种编码(UTF-16、ASCII等),但仍然出错 常见的解决方案是在XML解析之前删除/替换此无效字符。但是如果我们需要这个角色,如何在解组后获得原始角色Java 解组过程中的XML字符无效,java,xml-serialization,jaxb,unmarshalling,Java,Xml Serialization,Jaxb,Unmarshalling,我使用编码“UTF-8”将对象编组到XML文件。它成功地生成了文件。但当我试图将其解组时,出现了一个错误: 无效的XML字符(Unicode: 在的值中找到0x{2}) 属性“{1}”,元素为“0” 字符为0x1A或\u001a,在UTF-8中有效,但在XML中非法。JAXB中的Marshaller允许将此字符写入XML文件,但解组器无法将其解析回来。我尝试使用另一种编码(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;
}
}
不知何故,阅读器不会用我想要的字符替换无效字符。它会导致错误的XML数据,无法解组。我的InvalidXMLCharacterFilterReader类有什么问题吗?我认为主要的问题是在编组过程中转义非法字符。有人提到过类似的东西,你可以试试看
它提供将编码更改为Unicode
marshaller.setProperty(“jaxb.encoding”、“Unicode”)代码>Unicode字符U+001A是:
在这种情况下,用于表示它的编码并不重要,XML内容中不允许使用这种编码
(包括U+001A),但它们必须作为数字字符引用出现(;
)
Wikipedia有。您能签入XML头吗?在编组后,在XML头中定义了哪个字符集?是UTF-8吗?只有XML头中没有定义字符集。但是我把它放在:m.setProperty(Marshaller.JAXB_编码,“UTF-8”)代码>您知道如何将Marshaller属性设置为具有XML 1.1标头吗?我尝试了这个方法,但没有成功:m.setProperty(“com.sun.xml.bind.xmlHeaders”,”)代码>看起来JAXB还不支持XML 1.1:我不认为有问题的字符是0x02,请注意{2}和{1}周围的大括号,这看起来更像是错误消息中的占位符没有被替换。@Jörn:你说得对,U+001A似乎是问题所在,但是这个字符也有同样的问题。可以使用另一个XML序列化API来处理它吗?我在编组过程中尝试转义非法字符,正如上面提到的,这是将字符“0x1a”转换为字符引用“$#x1a;”,并将编码更改为“Unicode”,但我在解组过程中仍然遇到一个错误:字符引用“”是无效的XML字符。
FileReader fileReader = new FileReader(this.getFile());
Reader reader = new InvalidXMLCharacterFilterReader(fileReader);
Object o = (Object)um.unmarshal(reader);