Я упорядочиваю объекты в файл 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?