Недействительный символ XML во время демаршаллинга

Я упорядочиваю объекты в файл XML, используя кодировку «UTF-8». Он успешно создает файл. Но когда я пытаюсь вернуть его обратно, возникает ошибка:

Недопустимый символ XML (Unicode: Недопустимый символ XML (Unicode: 0x {2}) был ...

Я упорядочиваю объекты в файл XML, используя кодировку «UTF-8». Он успешно создает файл. Но когда я пытаюсь вернуть его обратно, возникает ошибка:

Недопустимый символ XML (Unicode: Недопустимый символ XML (Unicode: 0x {2}) был ...

Я упорядочиваю объекты в файл XML, используя кодировку «UTF-8». Он успешно создает файл. Но когда я пытаюсь вернуть его обратно, возникает ошибка:

Недопустимый символ XML (Unicode: 0x {2}) найдено в значении атрибут «{1}» и элемент «0»

Символ - 0x1A или \ u001a, что допустимо в UTF-8, но недопустимо в XML. Маршаллер в JAXB позволяет записать этот символ в файл XML, но Unmarshaller не может его разобрать. Я попытался использовать другую кодировку (UTF-16, ASCII и т. Д.), Но все равно ошибка.

Распространенное решение - удалить / заменить этот недопустимый символ перед синтаксическим анализом XML. Но если нам нужен этот символ обратно, как получить исходный символ после демаршаллинга?


В поисках этого решения я хочу заменить недопустимые символы на заменяющий символ (например, точка = ".") Перед демаршалингом.


12102] Я создал этот класс:

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?

10
задан casperOne 8 October 2012 в 11:33
поделиться