Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解组过程中的XML字符无效_Java_Xml Serialization_Jaxb_Unmarshalling - Fatal编程技术网

Java 解组过程中的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解析之前删除/替换此无效字符。但是如果我们需要这个角色,如

我使用编码“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);