Вопрос по xml, xml-parsing, java – org.xml.sax.SAXParseException: преждевременное завершение файла для * VALID * XML

35

Я получаю очень странное & quot; Преждевременное завершение файла. & Quot; Исключение за последние несколько дней на одном из наших серверов.same Конфигурационный XML отлично работает на другом сервере. Мы используем Tomcat 5.0.28 на обоих этих серверах. Этот код работал целую вечность (7+ лет), только после недавнего сбоя сервера мы столкнулись с этой проблемой на одном из серверов. Там нет изменений в XML, а также в коде синтаксического анализа Java. :(

Единственное отличие, которое я вижу, в версиях Java -

Problem Server Java-версия "1.6.0_16" Java (TM) SE Runtime Environment (сборка 1.6.0_16-b01) Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 14.2-b01, смешанный режим)

Working Server Java-версия "1.6.0_07" Java (TM) SE Runtime Environment (сборка 1.6.0_07-b06) Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 10.0-b23, смешанный режим)

Вот код Java, который работал в течение нескольких лет -

private void readSource(final InputSource in ) {
    try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(in);
        Element elt = doc.getDocumentElement();

        this.readElement( elt );
    } catch ( Exception ex ) {
        ex.printStackTrace();
        throw new ConfigurationException( "Unable to parse configuration information", ex );
    }
}

И здесь исключение.

[Fatal Error] :-1:-1: Premature end of file.
org.xml.sax.SAXParseException: Premature end of file.
        at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
        at com.circus.core.Configuration.readSource(Configuration.java:706)

Я уже пробовал проверять XML и не нашел там никаких ошибок. Любая идея, где еще я могу искать возможные проблемы?

Любые указатели будут высоко оценены!

ТИА, - Маниш

1. Как этоInputSource построен? 2. Насколько большойXML? 3. Есть лиXML приходят из локального файла, из URL, базы данных, другого источника потоковой передачи - возможно, сокет отключается илиInputStream закрывается в середине разбора? npe
@Manish: еще один вопрос: этоInputSource использовать повторно или всегда создавать с нуля? npe
Вы уверены, что при сбое сервера не было добавлено каких-либо специальных символов? Вы можете попробовать добавить XML с одного из ваших рабочих серверов и посмотреть, работает ли он. npinti
@npe - (1)InputSource построен сFileReader - this.readSource( new InputSource( fr ) );  (2) XML имеет размер 108,1 КБ. Так было давно. (3) XML поступает из локальной файловой системы. Я также подозреваю, еслиInputStream становится закрытым между. Как я могу это обнаружить? И снова, интересно, почему это работало раньше, а не сейчас :( @npinti - я использовал свежий XML из SVN, а также пробовал ту же версию в валидаторе XML.is действительный XML. Manish
@Manish: попробуйте установить точку останова внутриFileReader#close() и посмотрим, как это называется. Или подклассFileReader и добавить некоторые записи - вы можете, например, дамп байтов, которыеread() чтобы увидеть, прочитан ли файл полностью, или он где-то сломается. npe

Ваш Ответ

6   ответов
17

было усечение XML до файла 0 длины. Я позаботился об этом.

4

убедитесь, что вы не потребляетеinputstream где-нибудь до разбора. Пример кода следующий: остаток нижеhttpresponse(т. е. ответ) и основное содержание содержится внутриStringEntity (i.e. getEntity())in form of inputStream(i.e. getContent()).

InputStream rescontent = response.getEntity().getContent();
tsResponse=(TsResponse) transformer.convertFromXMLToObject(rescontent );
2

удостовериться : Если используемый входной поток не используется, то "До" каким-то образом, то, где вы собираетесь читать. Т.е. если читать 2 раза из одного и того же входного потока за одну операцию, то второй вызов получит это исключение. Также убедитесь, что входной поток закрыт в блоке finally или что-то в этом роде.

56

счетчик положения смещения файла перемещается в конец файла. При последующем чтении с использованием того же потока вы получите эту ошибку. Таким образом, вы должны закрыть и снова открыть поток или позвонитьinputStream.reset() сбросить счетчик смещения в исходное положение.

попробовал это, и это не сработало!
1

AndroidManifest.xml.

При обновлении Eclispe мы столкнулись собычная проблемаи AndroidManifest.xml должен быть проверен в SVN сценарием сборки после того, как был захвачен.

Нашел его путем компиляции из Eclipse, а не из командной строки.

11

если вы анализируете пустой массив String / empty.

ниже приведен фрагмент о том, как его воспроизвести:

String xml = ""; // <-- deliberately an empty string.
ByteArrayInputStream xmlStream = new java.io.ByteArrayInputStream(xml.getBytes());
Unmarshaller u = JAXBContext.newInstance(...)
u.setSchema(...);
u.unmarshal( xmlStream ); // <-- here it will fail

Похожие вопросы