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. Поэтому я предполагаю, что его просто не существует.

Ответы на вопрос(1)

Ваш ответ на вопрос