2010-05-11 3 views
1

Я работаю над фрагментом кода для разделения файлов. Я хочу разделить плоский файл (это нормально, он работает нормально) и xml-файл. Идея состоит в том, чтобы разбивать на несколько файлов на разделение: У меня есть файл, и я хочу разбить его в x файлах (x - это параметры). Я занимаюсь разделом, беря размер файла и разделяя его на количество файлов для разделения. Затем mysolution было использовать BufferedReader и использовать его какJava split xml file

while ((n = reader.read(buffer, 0, buffer.length)) != -1) { 


{ 

Основная проблема заключается в том, что для файла XML я не могу разделить его, но я должен разделить его на основе блока, отделенного от начала xml tag и end xml tag:

<start tag> 
bla bla xml stuff 
</end tag> 

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

Проблема в том, что у меня есть всевозможные случаи, и немного сложно найти конечный тег. - блок считывает текст до середины концевого тега - блок считывает текст до конца концевого тега и не более другого символа после - и т. Д. и в то же время имеет петлю и считывает следующий блок. Несколько раз в конце блока, объединенного с началом следующего, у меня есть конечный тег xml. Надеюсь, у вас есть идея.

Мой вопрос: есть ли у кого-нибудь алгоритм, который делает это более точным и кто я рассматриваю все особые случаи?

Идея состоит в том, чтобы разбить файл как можно быстрее. Я не хотел использовать lib для обработки файла в виде XML-файла, потому что размер блока был меньше или очень большой, и я не знаю, хватит ли памяти. Или есть какой-то lib, который не загружает все в память?

Спасибо большое.

Ниже приведен пример моего xml-файла;

<?xml version="1.0" encoding="UTF-8" ?> 
<myTag service="toto" version="1.5.18" > 
<endOfPeriodTradeNotification version="1.5.18"> 
............. 
</endOfPeriodTradeNotification> 
<endOfPeriodTradeNotification version="1.5.18"> 
............. 
</endOfPeriodTradeNotification> 
<endOfPeriodTradeNotification version="1.5.18"> 
............. 
</endOfPeriodTradeNotification> 
<inventoryDate>2009-12-31</inventoryDate> 
<!-- reporting date --> 
    <processingDate>2010-01-29T00:00:00</processingDate> 
</myTag> 

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

+0

являются тегами, вложенными? Есть ли в документе несколько «корневых» тегов? – aioobe

+0

№. У меня есть материал, затем стартовый тег позже концевого тега. Внутри них есть теги xml (не одинаковые), а после последнего тега - некоторые вещи. –

+0

Начальный и конечный теги являются конкретными или могут быть любыми тегами (определенными, когда размер больше max)? –

ответ

1

Хотя вы заявили, что не хотите использовать lib, который рассматривает его как файл XML. Возможно, вы захотите использовать SAX.

Использование SAX, а не DOM, ваши страхи относительно памяти устраняются, так как весь файл не загружается в память, но происходят события, когда ваше приложение считывает файл и сталкивается с ориентирами XML, такими как начальные и конечные теги.

SAX также довольно быстро.

Это руководство Quickstart должно помочь: http://www.saxproject.org/quickstart.html

+0

Я не хочу, потому что я не хочу загружать в память блок, потому что он может быть огромным, но это есть lib, который не загружает все в память, я в порядке. –

0

При условии, что конечные теги, которые вы после этого находятся на линиях по их самих, вы могли бы просто сделать

String line; 
while ((line = reader.readLine()) != null) 

вместо:

while ((n = reader.read(buffer, 0, buffer.length)) != -1) 

, а затем разбивается на новый файл, когда line соответствует концевому тегу, и текущий файл достаточно велик.

Если они не являются линиями сами по себе, вы можете вместо этого добавить тег, разделить строку, поместить первую часть в текущий файл и сохранить вторую часть для следующего файла.


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

<?xml version="1.0" encoding="UTF-8" ?> 
<myTag service="toto" version="1.5.18" > 
<endOfPeriodTradeNotification version="1.5.18"> 
............. 
</endOfPeriodTradeNotification> 
<endOfPeriodTradeNotification version="1.5.18"> 

, и это недопустимо xml. ни один не

<inventoryDate>2009-12-31</inventoryDate> 
    <!-- reporting date --> 
    <processingDate>2010-01-29T00:00:00</processingDate> 
</myTag> 
+0

Конечно, я все это делаю. –

0

Лучший инструмент для разделения файлов XML есть, руки вниз, vtd-xml. Это не только очень быстро, но и очень легко кодировать ваше приложение, например, используя xpath.