Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Java stax - content is not allowed in prolog


Автор: rang3r 29.1.2014, 15:51
Добрый день.
помогите пж-та в решении такой проблемы.
Есть код генерации xml.
Код

 XMLOutputFactory xmlOutputFactory = WstxOutputFactory.newFactory();
        xmlOutputFactory.setProperty(WstxOutputProperties.P_OUTPUT_INVALID_CHAR_HANDLER, new InvalidCharHandler() {
            @Override
            public char convertInvalidChar(int i) throws IOException {
                return ' ';
            }
        });
        XMLEventFactory xmlEventFactory = XMLEventFactory.newInstance();
        XMLEventWriter xmlEventWriter = null;
        try {
            xmlEventWriter = xmlOutputFactory.createXMLEventWriter(result);
            XMLEvent end = xmlEventFactory.createCharacters("\n");
            XMLEvent tab = xmlEventFactory.createCharacters("\t");
            StartDocument startDocument = xmlEventFactory.createStartDocument("UTF-8", "1.0");
            xmlEventWriter.add(startDocument);
            xmlEventWriter.add(end);
.........
            xmlEventWriter.flush()
        }
        finally {
            if (xmlEventWriter != null) {
                try {
                    xmlEventWriter.close();
                } catch (XMLStreamException e) {
                    log.error("Exception while close xmlEventWriter", e);
                }
            }
        }


Он пишет xml контент в файл .gz. 

Result result = new StreamResult(new GZipOuputStream()) 

Файл строиться нормально, но при проверке файла сервисом валидации летит ошибка:
Код

Содержимое документа, найденное перед корневым элементом, имеет неверный формат.
Строка: 1 Позиция: 1
Подробнее
Content is not allowed in prolog.


В инете нашел ссылки на BOM метки перед <?xml ....?> , но так и не понял кто их пишет и как от этого изюавиться.
Если скопировать в нот-паде текст файлика и вставить в сервис проверки , то все ок. не проходит автоматическое считывание из файла/архива.

Собственно вопрос: кто их пишет эту метку и как от этого избавиться.
Вариант с перечитыванием файла с 
Код

string.replace("", "") 

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

Автор: LSD 29.1.2014, 16:10
1. Это косяк сервиса валидации, BOM и по хорошему чинить надо его.
2. Попробуй заменить Result на Writer
Код

Writer writer = new OutputStreamWriter(new GZIPOutputStream(null), StandardCharsets.UTF_8)

Автор: rang3r 29.1.2014, 16:13
Цитата(LSD @ 29.1.2014,  16:10)
1. Это косяк сервиса валидации, BOM и по хорошему чинить надо его.
2. Попробуй заменить Result на Writer
Код

Writer writer = new OutputStreamWriter(new GZIPOutputStream(null), StandardCharsets.UTF_8)

Спасибо! попробую.

Автор: rang3r 29.1.2014, 16:43
Попробовал все вариант. 
И с Result, и c OutputStream (+ charset), и с Writer  (+ charset) все одно.
Код

Содержимое документа, найденное перед корневым элементом, имеет неверный формат.
Строка: 1 Позиция: 1
Подробнее
Content is not allowed in prolog.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)