Я пытался прочитать большой xml-файл (около 500 МБ). Прежде всего, я использовал xjc с файлом XSD моего XML. Все классы были сгенерированы, как и ожидалось. Пытаясь прочитать файл, я получил эту ошибку: javax.xml.bind.UnmarshalException: неожиданный элемент.
Вот мой код:
(...)
JAXBContext context = JAXBContext.newInstance("br.com.mypackage");
Unmarshaller unmarshaller = context.createUnmarshaller();
File f = new File("src/files/MyHuge.CNX");
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
InputStream in = new FileInputStream(f);
XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
Person p = null;
int count = 0;
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
if (event.isStartElement()) {
StartElement startElement = event.asStartElement();
if (startElement.getName().getLocalPart() == ("person")) {
p = (Person) unmarshaller.unmarshal(eventReader);
}
}
}
Проблема в немаршалной эксплуатации.
Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"identification"). Expected elements are <{}messageAll>
Я использовал эту ссылку в качестве примера, чтобы создать свой собственный код:
Кто-то знает, как это сделать? Все, что я хочу сейчас, это прочитать огромный файл XML без демаршалирования внешнего объекта XML (проблема пространства кучи Java) и без чтения тег за тегом, получая соответствующее значение, медленный и обезьяний код (не обезьяны из Rise of the Planet обезьян). :П
Большое спасибо.
if (start.getName().getLocalPart() == "person")) { JAXBElement<Person> jax_benef = unmarshaller.unmarshal(eventReader, Person.class); p = jax_benef.getValue(); }
Не знаю, почему старый метод не работает (распаковать, используя объект Person вместо JAXBElement). У вас есть какие-то сведения о том, что это не сработало? 14.12.2011