Java-файл XML - PullRequest
       18

Java-файл XML

1 голос
/ 11 мая 2010

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

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


{

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

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

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

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

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

Идея состоит в том, чтобы разбить файл как можно быстрее. Я не хотел использовать lib для обработки файла как 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">
 .............
 </endOfPeriodTradeNotification>
 <endOfPeriodTradeNotification  version="1.5.18">
 .............
 </endOfPeriodTradeNotification>
 <inventoryDate>2009-12-31</inventoryDate> 
 <!--  reporting date --> 
  <processingDate>2010-01-29T00:00:00</processingDate> 
 </myTag>

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

Ответы [ 3 ]

1 голос
/ 11 мая 2010

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

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

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

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

0 голосов
/ 28 июля 2013

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

0 голосов
/ 11 мая 2010

Если конечные теги, за которыми вы следите, находятся на линии сами по себе, вы можете просто сделать

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

вместо:

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

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

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


Однако, как указано в комментариях, разделенные 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...