Как эффективно написать файл базы данных xml? - PullRequest
2 голосов
/ 26 января 2011

Я хочу создать файл XML как хранилище данных.Это должно выглядеть примерно так:

<datastore>
    <item>
        <subitem></subitem>
        ...
        <subitem></subitem>
    </item>
    ....
    <item>
        <subitem></subitem>
        ...
        <subitem></subitem>
    </item>
</datastore>

Во время выполнения мне может понадобиться добавить элементы в хранилище данных.Количество элементов может быть большим, поэтому я не хочу хранить весь документ в памяти и не могу использовать DOM.Я просто хочу написать часть, где происходят изменения. Или DOM поддерживает это?

Я впервые посмотрел на StAX, но я не уверен, что он делает то, что я хочу.

Не будет ли этолучше всего запомнить положение курсора в конце файла как раз перед закрытием корневого элемента?Это всегда позиция, где будут добавлены новые предметы.Поэтому, если я запомню эту позицию и буду постоянно обновлять ее во время изменений, я мог бы добавить новый элемент в конце, без перебора всего файла.

Может быть, второй курсор может использоваться независимо от первогово-первых, для перебора документа только для целей чтения.

Я не вижу, чтобы StAX что-либо из этого поддерживал, не так ли?

Разве для этого не существует блочного API для файлов?потока основывает один?Разве файлы и файловые системы не являются типичными примерами для блочных «устройств»?А если есть такой API, поможет ли он мне с моей проблемой?

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 26 января 2011

Как правило, файлы XML не очень эффективны в качестве хранилищ данных, не для данных на основе записей, для которых вы, похоже, хотите их использовать.

Но если у вас уже есть файли абсолютно ничего не могу с этим поделать, вы можете использовать StAX XMLEventReader s и XMLEventWriter s, чтобы быстро прочитать файл и вставить / изменить его элементы.

Но когда я говорю быстро, чтоЯ имею в виду, что это быстрее, чем DOM, но далеко не так эффективен, как любая реляционная БД.

Обновление: Другой вариант, который вы можете рассмотреть, это vtd-xml ,хотя я не пробовал его в реальных проектах, на самом деле он выглядит довольно прилично.

1 голос
/ 26 января 2011

Обновление XML в принципе невозможно, потому что нет «дешевого» способа вставки данных.

Добавление XML не так уж плохо. Все, что вам нужно сделать, это выполнить поиск в конце файла, затем GO BACK над «конечным тегом» (в данном случае ), а затем просто начать запись. Все это дешевая операция, но ни одна из фреймворков действительно не поддерживает это, поскольку все они в основном предназначены для работы с правильно сформированными, полными рабочими XML-документами в целом, а не по частям.

Вы можете использовать что-то вроде StAX, но в этом случае StAX не знает о теге , а просто знает о тегах и его элементах. Затем вы создаете Предметы и начинаете многократно записывать в тот же OutputStream, который вы настроили.

Это лучший способ сделать это.

Но если вам нужно удалить или изменить данные, то вы можете переписать что-либо или сделать хаки, например пометить элементы как «неактивные», отыскать их в файле XML и найти «active =" Y » 'атрибут, а затем на месте, изменив Y на N. Это можно сделать, это будет в основном эффективно, но это далеко за пределами того, что позволяют делать обычные платформы обработки XML. Если бы мне пришлось это сделать, я бы прочитал весь файл, отслеживал эти записи и отмечал их расположение в нем, чтобы позже я мог легко найти и изменить их.

Затем, когда вы обновляете что-то, вы «деактивируете» старое и «добавляете» новое. В конце концов получите GC файл, переписав его и выбросив старые, «неактивные» записи.

0 голосов
/ 27 января 2011

Частично обновить XML-файл не очень просто и неэффективно, так что вы не найдете большой поддержки для него в качестве варианта использования.

На самом деле это звучит так, как будто вам нужна правильная база данных, возможно, с инструментом для экспорта данных в формате XML.

Если вы не хотите использовать БД и настаиваете на хранении данных исключительно в формате XML, вы можете рассмотреть возможность сохранения всех своих элементов в памяти в качестве объектов. Каждый раз, когда добавляется новый, вы можете записать их все в XML. Это может показаться неэффективным, но в зависимости от размера ваших данных все еще может быть достаточно хорошим.

Если вы выберете этот путь, вы, возможно, захотите проверить библиотеку Xstream, чтобы сделать это довольно просто, см. Краткий пример stream tutorial

0 голосов
/ 27 января 2011

Если вы всегда хотите добавлять элементы в конце, то лучший способ справиться с этим - это иметь два XML-файла. Внешний файл datstore.xml является просто оболочкой и выглядит так:

<!DOCTYPE datastore [
  <!ENTITY e SYSTEM "items.xml">
]>
<datastore>&e;</datastore>

Файл items.xml выглядит так:

<item>....</item>
<item>....</item>
<item>....</item>

без элемента-оболочки.

Когда вы хотите добавить данные, вы можете открыть файл items.xml и записать его в конец. Если вы хотите прочитать данные, откройте datastore.xml с помощью XML-анализатора.

Конечно, как только объем ваших данных превысит 20 МБ или около того, может быть лучше использовать базу данных XML. Но я годами использовал этот подход для записей саксонских заказов, с файлами, которые в настоящее время занимают около 8 МБ, и он отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...