0 голосов вниз Использование antlr для генерации парсера просто великолепно. Получающийся в результате парсер не только обеспечивает смещения, которые мне нужны, он также оказывается идеальным парсером утилит для общего использования. Отлично сработано!
ли способ использовать StAX и JAX-B для создания индекса, а затем получить быстрый доступ к XML-файлу?
У меня большой XML-файл, и мне нужно найти в нем информацию. Это используется в настольном приложении и поэтому должно работать в системах с небольшим количеством оперативной памяти.
Итак, моя идея заключается в следующем: создать индекс, а затем быстро получить доступ к данным из большого файла.
Я не могу просто разделить файл, потому что это официальная федеральная база данных, которую я хочу использовать без изменений.
Используя XMLStreamReader, я могу быстро найти какой-то элемент, а затем использовать JAXB для демаршаллинга элемента.
final XMLStreamReader r = xf.createXMLStreamReader(filename, new FileInputStream(filename));
final JAXBContext ucontext = JAXBContext.newInstance(Foo.class);
final Unmarshaller unmarshaller = ucontext.createUnmarshaller();
r.nextTag();
while (r.hasNext()) {
final int eventType = r.next();
if (eventType == XMLStreamConstants.START_ELEMENT && r.getLocalName().equals("foo")
&& Long.parseLong(r.getAttributeValue(null, "bla")) == bla
) {
// JAX-B works just fine:
final JAXBElement<Foo> foo = unmarshaller.unmarshal(r,Foo.class);
System.out.println(foo.getValue().getName());
// But how do I get the offset?
// cache.put(r.getAttributeValue(null, "id"), r.getCursor()); // ???
break;
}
}
Но я не могу получить компенсацию. Я хотел бы использовать это для подготовки индекса:(id of element) -> (offset in file)
Тогда я смогу использовать смещение, чтобы просто демаршировать оттуда: открыть поток файлов, пропустить столько байтов, unmarshall. Я не могу найти библиотеку, которая делает это. И я не могу сделать это самостоятельно, не зная положения курсора файла.Javadoc ясно говорит, что есть курсор, но я не могу найти способ получить к нему доступ.
Редактировать:
Я просто пытаюсь предложить решение, которое будет работать на старом оборудовании, чтобы люди могли его использовать. Не каждый может позволить себе новый и мощный компьютер. Используя StAX, я могу получить данные за 2 секунды, что немного длинно. Но это не требует оперативной памяти. Для использования JAX-B требуется 300 МБ ОЗУ. Использование некоторой встроенной системы БД было бы очень трудоемким для такой простой задачи. Я все равно буду использовать JAX-B. Все остальное было бы бесполезно для меня, так как сгенерированные wsimport классы уже совершенны. Я просто не хочу загружать 300 МБ объектов, когда мне нужно только несколько.
Я не могу найти БД, которой просто нужен XSD для создания БД в памяти, которая не использует так много ОЗУ. Это все сделано для серверов или требуется определить схему и отобразить XML. Поэтому я предполагаю, что его просто не существует.