Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > SaxException. Prolog. Reader.


Автор: chief39 19.7.2007, 20:25
Такая проблемка вышла...

Юзаем DBunit для тестов.
Использовали заполнялку простую, читающую из xml данные.
Всё было ок, но потом вставили реальные данные, в котором специфические символы норвежского языка обитают.
Заартачилось. Решил указать ему кодировку и для этого инпут стрим заменил на инпут стрим ридер.
И получил 
Цитата

org.dbunit.dataset.DataSetException: Line 1: Content is not allowed in prolog.
    at org.dbunit.dataset.xml.FlatXmlProducer.produce(FlatXmlProducer.java:163)
    at org.dbunit.dataset.CachedDataSet.<init>(CachedDataSet.java:71)
    at org.dbunit.dataset.xml.FlatXmlDataSet.<init>(FlatXmlDataSet.java:150)
    at org.dbunit.dataset.xml.FlatXmlDataSet.<init>(FlatXmlDataSet.java:137)
...

убрал норвежские символы - со стримом катит, с ридером - нет.
Прочитал о баге такой, грят - в 1.4.2_12 была, с 1.4.2_13 пофиксили. Поставил 1.4.2_15 - фигу.

Код читания:
Код


InputStream testData = this.getClass().getResourceAsStream("/" + filename);

            try {
                InputStreamReader testDataReader = new InputStreamReader(testData, "UTF-8");


                System.out.println("0: ENC:" + testDataReader.getEncoding() );
                System.out.println("1");
                // Тут можно в конструктор давать стрим или ридер - если дать testData вместо testDataReader - пашет
                FlatXmlDataSet flatDataSet = new FlatXmlDataSet(testDataReader );
                System.out.println("2");
                ReplacementDataSet dataSet = new ReplacementDataSet(flatDataSet);
                System.out.println("3");

                /*ReplacementDataSet dataSet = new ReplacementDataSet(
                        new FlatXmlDataSet(testDataReader)
                );*/
                dataSet.addReplacementObject("[NULL]", null);
                dataSets.add(dataSet);

            } catch (UnsupportedEncodingException e) {
                logger.error("An error occurs during fixture [" + fixture + "] loading. Wrong encoding");
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
                logger.error("An error occurs during fixture [" + fixture + "] loading.");
            }


Сам файл данных:
Код

<?xml version="1.0"?>
<dataset>
    <statutory_code P_SC_OID="1" SC_IE_TYPE="000" SC_IE_TYPE_DESCRIPTION="" SC_INSTRUMENT_CODE="115" SC_INSTRUMENT_DESCRIPTION="Sedler og skillemynt" SC_SUB_INSTRUMENT_CODE="00" SC_SUB_INSTRUMENT_DESCRIPTION="-"/>
      <statutory_code P_SC_OID="2" SC_IE_TYPE="000" SC_IE_TYPE_DESCRIPTION="" SC_INSTRUMENT_CODE="121" SC_INSTRUMENT_DESCRIPTION="Innskudd" SC_SUB_INSTRUMENT_CODE="00" SC_SUB_INSTRUMENT_DESCRIPTION="-"/>
      <statutory_code P_SC_OID="3" SC_IE_TYPE="000" SC_IE_TYPE_DESCRIPTION="" SC_INSTRUMENT_CODE="121" SC_INSTRUMENT_DESCRIPTION="Innskudd" SC_SUB_INSTRUMENT_CODE="00" SC_SUB_INSTRUMENT_DESCRIPTION="-"/>
      <statutory_code P_SC_OID="4" SC_IE_TYPE="000" SC_IE_TYPE_DESCRIPTION="" SC_INSTRUMENT_CODE="131" SC_INSTRUMENT_DESCRIPTION="Statskasseveksler" SC_SUB_INSTRUMENT_CODE="00" SC_SUB_INSTRUMENT_DESCRIPTION="-"/>
      <statutory_code P_SC_OID="5" SC_IE_TYPE="000" SC_IE_TYPE_DESCRIPTION="" SC_INSTRUMENT_CODE="131" SC_INSTRUMENT_DESCRIPTION="Statskasseveksler" SC_SUB_INSTRUMENT_CODE="60" SC_SUB_INSTRUMENT_DESCRIPTION="Kursreguleringskonto (Kan være negativ)"/>
</dataset>


В прологе указывал UTF-8 - пофик :-/

Копал, гуглил... Ну не понятно что именно ему не нравится!!!  smile 
Может уже тупею, но какие претензии к идентичному абсолютно файлу в двух методах считывания?

Автор: LSD 20.7.2007, 12:00
Нифига не понял, в чем проблема. В JDK 1.4 это файл парсится без проблем.

Автор: chief39 20.7.2007, 13:05
Цитата(chief39 @  19.7.2007,  20:25 Найти цитируемый пост)
// Тут можно в конструктор давать стрим или ридер - если дать testData вместо testDataReader - пашет
                FlatXmlDataSet flatDataSet = new FlatXmlDataSet(testDataReader );

Вот тут. Дибиюнит принимает ридер и парсит - и ругается уже в нём.
Глядел откель ноги растут в сырцах дибиюнита - там вполне обычный саккс эксепшн, поймал - и отправил наверх.
На стриме не ругается... на ридере матерится. Дивно как-то. файл тот же, а докопался к КСМЛу...

Автор: LSD 20.7.2007, 13:20
Возьми свой файл и:
Код
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
FileInputStream in = new FileInputStream("chief39.xml");
parser.parse(in, new DefaultHandler());
in.close();

будет ошибка или нет.

Автор: chief39 20.7.2007, 15:24
Код

SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
InputStream in = this.getClass().getResourceAsStream("/" + fixture);
parser.parse(in, new DefaultHandler());
in.close();


Встроил в свой код
Читает на ура

это какая-то лажа с дибиюнитом

так как пролетает на вариантах инпутстрим/инпутстримридер - стрим читает, ридер - нет.
http://dbunit.sourceforge.net/apidocs/org/dbunit/dataset/xml/FlatXmlDataSet.html в конструкторах никаких отличий нет - бери да читай...
Может я что-то недоглядел в них.....

Автор: LSD 20.7.2007, 16:00
Исходники глядел?
Да и ексепшен целиком дай smile 

Автор: chief39 20.7.2007, 19:27
сяс

Добавлено через 5 минут и 17 секунд
О!  smile 
Цитата

org.dbunit.dataset.DataSetException: Line 1: Content is not allowed in prolog.
    at org.dbunit.dataset.xml.FlatXmlProducer.produce(FlatXmlProducer.java:163)
    at org.dbunit.dataset.CachedDataSet.<init>(CachedDataSet.java:71)
    at org.dbunit.dataset.xml.FlatXmlDataSet.<init>(FlatXmlDataSet.java:150)
    at org.dbunit.dataset.xml.FlatXmlDataSet.<init>(FlatXmlDataSet.java:137)
    at com.xxx.statistics.core.common.SpringBaseTest.<init>(SpringBaseTest.java:88)
    at com.xxx.statistics.core.dao.StatutoryCodeDaoTest.<init>(StatutoryCodeDaoTest.java:17)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:274)
    at junit.framework.TestSuite.createTest(TestSuite.java:54)
    at junit.framework.TestSuite.addTestMethod(TestSuite.java:280)
    at junit.framework.TestSuite.<init>(TestSuite.java:140)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:274)
    at org.apache.maven.surefire.junit.JUnitTestSet.constructTestObject(JUnitTestSet.java:151)
    at org.apache.maven.surefire.junit.JUnitTestSet.getTestCount(JUnitTestSet.java:247)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.locateTestSets(AbstractDirectoryTestSuite.java:104)
    at org.apache.maven.surefire.Surefire.createSuiteFromDefinition(Surefire.java:150)
    at org.apache.maven.surefire.Surefire.run(Surefire.java:111)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:324)
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:290)
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:818)
org.xml.sax.SAXParseException: Content is not allowed in prolog.
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at org.dbunit.dataset.xml.FlatXmlProducer.produce(FlatXmlProducer.java:145)
    at org.dbunit.dataset.CachedDataSet.<init>(CachedDataSet.java:71)
    at org.dbunit.dataset.xml.FlatXmlDataSet.<init>(FlatXmlDataSet.java:150)
    at org.dbunit.dataset.xml.FlatXmlDataSet.<init>(FlatXmlDataSet.java:137)
    at com.edb.finance.product.bank.statistics.core.common.SpringBaseTest.<init>(SpringBaseTest.java:88)
    at com.edb.finance.product.bank.statistics.core.dao.StatutoryCodeDaoTest.<init>(StatutoryCodeDaoTest.java:17)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:274)
    at junit.framework.TestSuite.createTest(TestSuite.java:54)
    at junit.framework.TestSuite.addTestMethod(TestSuite.java:280)
    at junit.framework.TestSuite.<init>(TestSuite.java:140)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:274)
    at org.apache.maven.surefire.junit.JUnitTestSet.constructTestObject(JUnitTestSet.java:151)
    at org.apache.maven.surefire.junit.JUnitTestSet.getTestCount(JUnitTestSet.java:247)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.locateTestSets(AbstractDirectoryTestSuite.java:104)
    at org.apache.maven.surefire.Surefire.createSuiteFromDefinition(Surefire.java:150)
    at org.apache.maven.surefire.Surefire.run(Surefire.java:111)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:324)
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:290)
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:818)
org.xml.sax.SAXParseException: Content is not allowed in prolog.
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at org.dbunit.dataset.xml.FlatXmlProducer.produce(FlatXmlProducer.java:145)
    at org.dbunit.dataset.CachedDataSet.<init>(CachedDataSet.java:71)
    at org.dbunit.dataset.xml.FlatXmlDataSet.<init>(FlatXmlDataSet.java:150)
    at org.dbunit.dataset.xml.FlatXmlDataSet.<init>(FlatXmlDataSet.java:137)
    at com.edb.finance.product.bank.statistics.core.common.SpringBaseTest.<init>(SpringBaseTest.java:88)
    at com.edb.finance.product.bank.statistics.core.dao.StatutoryCodeDaoTest.<init>(StatutoryCodeDaoTest.java:17)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:274)
    at junit.framework.TestSuite.createTest(TestSuite.java:54)
    at junit.framework.TestSuite.addTestMethod(TestSuite.java:280)
    at junit.framework.TestSuite.<init>(TestSuite.java:140)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:274)
    at org.apache.maven.surefire.junit.JUnitTestSet.constructTestObject(JUnitTestSet.java:151)
    at org.apache.maven.surefire.junit.JUnitTestSet.getTestCount(JUnitTestSet.java:247)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.locateTestSets(AbstractDirectoryTestSuite.java:104)
    at org.apache.maven.surefire.Surefire.createSuiteFromDefinition(Surefire.java:150)
    at org.apache.maven.surefire.Surefire.run(Surefire.java:111)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:324)
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:290)
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:818)


http://dbunit.svn.sourceforge.net/svnroot/dbunit/trunk/src/java/org/dbunit/dataset/xml/FlatXmlProducer.java

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