Разбор DOM с XML-файлами UTF-8 - PullRequest
       17

Разбор DOM с XML-файлами UTF-8

0 голосов
/ 19 сентября 2019

Я использую компонент Primefaces <p:fileUpload> для выбора файлов пользователями.В этом я использую атрибут fileUploadListener, который использует пользовательский метод для чтения XML-файлов и их анализа с использованием DOMParser.Мой код для чтения и анализа файлов сводится к следующему:

InputStream inputStream = new FileInputStream("C:\\test\\test_ansi.xml");
Reader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
InputSource is = new InputSource(new BufferedReader(inputStreamReader));
DOMParser parser = new DOMParser();
parser.parse(is);
Document doc = parser.getDocument();

Мне нужно преобразовать все выбранные пользователем XML-файлы в UTF-8 перед дальнейшей их обработкой.Если я попробую приведенный выше код с файлом, закодированным как ANSI, он будет работать нормально.Но если файл закодирован как UTF-8, я получаю следующую ошибку:

oracle.xml.parser.v2.XMLParseException; lineNumber: 1; columnNumber: 1; Start of root element expected.
    at oracle.xml.parser.v2.XMLError.flushErrors(XMLError.java:233)
    at oracle.xml.parser.v2.XMLError.error(XMLError.java:133)
    at oracle.xml.parser.v2.XMLError.error(XMLError.java:171)
    at oracle.xml.parser.v2.NonValidatingParser.parseRootElement(NonValidatingParser.java:280)
    at oracle.xml.parser.v2.NonValidatingParser.parseDocument(NonValidatingParser.java:241)
    at oracle.xml.parser.v2.XMLParser.parse(XMLParser.java:124)

Для образцов файлов UTF-8 я просто сохраняю файл с кодировкой UTF-8 в Блокноте,Может кто-нибудь, пожалуйста, помогите мне понять, что происходит не так?

1 Ответ

2 голосов
/ 19 сентября 2019

Похоже, что закодировано, поскольку файл UTF-8 содержит Символ спецификации Unicode в начале, и поэтому анализ не выполняется.

Вы можете обернуть FileInputStream, используя BOMInputStream как это

InputStream inputStream = new FileInputStream("C:\\test\\test_ansi.xml");
BOMInputStream bomInputStream = new BOMInputStream(inputStream, false);
Reader inputStreamReader = new InputStreamReader(bomInputStream, StandardCharsets.UTF_8);

Создает новую спецификацию InputStream, которая обнаруживает ByteOrderMark.UTF_8 и исключает его.

Пожалуйста, найдите более подробную информацию здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...