org.xmlpull.v1.XmlPullParserException

Я пытаюсь связать файл xml (как byte[]) с объектом java. Это мой код-

public voidinputConfigXML(String xmlfile, byte[] xmlData) {
    IBindingFactory bFact = BindingDirectory.getFactory(GroupsDTO.class);
                IUnmarshallingContext uctx = bFact.createUnmarshallingContext();
                groups = (GroupsDTO) uctx.unmarshalDocument(new ByteArrayInputStream(xmlData), "UTF8");
}

unmarshalDocument() дает мне это исключение. Что я делаю?

Для справки: запуск в качестве тестового примера JUnit

Ниже приведена трассировка стека:

    Error parsing document (line 1, col 1)
    org.xmlpull.v1.XmlPullParserException: only whitespace content allowed before start tag and not \u0 (position: START_DOCUMENT seen \u0... @1:1) 
        at org.xmlpull.mxp1.MXParser.parseProlog(MXParser.java:1519)
        at org.xmlpull.mxp1.MXParser.nextImpl(MXParser.java:1395)
        at org.xmlpull.mxp1.MXParser.next(MXParser.java:1093)
        at org.jibx.runtime.impl.XMLPullReaderFactory$XMLPullReader.next(XMLPullReaderFactory.java:291)
        at org.jibx.runtime.impl.UnmarshallingContext.toStart(UnmarshallingContext.java:451)
        at org.jibx.runtime.impl.UnmarshallingContext.unmarshalElement(UnmarshallingContext.java:2755)
        at org.jibx.runtime.impl.UnmarshallingContext.unmarshalDocument(UnmarshallingContext.java:2905)
        at abc.dra.DRAAPI.inputConfigXML(DRAAPI.java:31)
        at abc.dra.XMLToObject_Test.test(XMLToObject_Test.java:34)
        [...]

Это мой код, который формирует byte[]-

void test() {
String xmlfile = "output.xml"
File file = new File(xmlfile);
byte[] xmlData = new byte[(int) file.length()];
groups = dra.inputConfigXML(xmlfile, xmlData);
}

person hari    schedule 21.05.2012    source источник
comment
Пожалуйста, добавьте трассировку стека. Внутри может быть интересная информация.   -  person Christian Kuetbach    schedule 21.05.2012
comment
Пожалуйста, добавьте abc.dra.DRAAPI.inputConfigXML к вашему вопросу   -  person Christian Kuetbach    schedule 21.05.2012
comment
@ChristianKuetbach Код, который я добавил в начале, это abc.dra.DRAAPI.inputConfigXML.   -  person hari    schedule 21.05.2012
comment
Нет, самое интересное — это создание xmlData. И этот кусок кода отсутствует.   -  person Christian Kuetbach    schedule 21.05.2012
comment
@ChristianKuetbach я добавил код внизу вопроса   -  person hari    schedule 21.05.2012


Ответы (3)


ByteArrayInputstream пуст:

only whitespace content allowed before start tag and not \u0 
(position: START_DOCUMENT seen \u0... @1:1) 

означает, что бит \u0 был найден как первый символ в XML.

Убедитесь, что у вас есть содержимое в byte[], а UTF-8 не начинается с BOM.

Я не думаю, что BOM - это ваша проблема, но я часто сталкиваюсь с BOM и java.

обновить

Вы не заполняете byte[]. Вы должны прочитать содержимое файла в byte[]: прочитайте это: File to byte[] в Java

Кстати: byte[] xmlData = new byte[(int) file.length()]; - это плохой стиль кода, потому что вы столкнетесь с проблемами с большими XML-файлами. Если они больше Integer.MAX_VALUE, вы прочитаете поврежденный файл.

person Christian Kuetbach    schedule 21.05.2012

Хари,
JiBX нужны символы в качестве входных данных. Я думаю, вы неправильно указали кодировку. Вместо этого попробуйте этот код:

FileInputStream fis = new FileInputStream("output.xml");
InputStreamReader isr = new InputStreamReader(fis, "UTF8");
groups = (GroupsDTO) uctx.unmarshalDocument(isr);

Если вы должны использовать написанный вами код, я бы попробовал вывести текст в консоль (System.put.println(xxx)), чтобы убедиться, что вы правильно декодируете utf-8.

Дон

person Don Corley    schedule 22.05.2012

Перейдите к пути к репозиторию mvn и удалите эту папку для файла xml.

person Community    schedule 05.06.2012
comment
Поскольку я видел эту проблему с Maven, это решение сработало для меня. Однако я не решаюсь проголосовать за это, так как не думаю, что ОП вообще имел дело с Maven. Но для тех, у кого в будущем возникнут проблемы с Maven, попробуйте этот вариант. - person rbwhitaker; 24.02.2014