2011-03-15 9 views
1

У меня есть большой (1 ГБ) файл, который мне нужно разделить на более мелкие файлы. Я хочу, чтобы каждый файл меньшего размера содержал 500 тегов <OFFER>.Разделить XML-файл на несколько файлов с 500 тегами каждый

Вот небольшой фрагмент из большого файла XML:

<?xml version="1.0"?><RESULT> 
<header> 
    <site>http://www.thomascook.fr</site> 
    <marque>ThomasCook France</marque> 
    <logo>http://www.example.com/example.gif</logo> 
</header> 
<OFFER> 
    <IFF>5810</IFF> 
    <TO>TCF</TO> 
    <COUNTRY>Chypre</COUNTRY> 
    <REGION>Chypre du Sud</REGION> 
    <HOTELNAME>Elias Beach &amp; Country Club</HOTELNAME> 
    <DESCRIPTION>....</DESCRIPTION> 
    <TYPE>Sejour</TYPE> 
    <STARS>5.0</STARS> 
    <THEMAS>Plage directe;Special enfant;Bien-Etre-Fitness</THEMAS> 
    <THUMBNAIL>http://example.com/example.jpg</THUMBNAIL> 
    <URL>http://example.com/example.html</URL> 
    <DATE> 
     <BROCHURE>TCFB</BROCHURE> 
     <DURATION>7</DURATION> 
     <DURATION_VAR>6_6-9</DURATION_VAR> 
     <BOARD>Demi-pension</BOARD> 
     <DEPARTURE>27.2.2011</DEPARTURE> 
     <RETURN>6.3.2011</RETURN> 
     <DEPARTURE_CITY>PAR</DEPARTURE_CITY> 
     <ARRIVAL_CITY>LCA</ARRIVAL_CITY> 
     <PRICE>790</PRICE> 
     <URL>http://example.com/other-example.html</URL> 
    </DATE> 
</OFFER> 
<OFFER> 
    (etc) 
</OFFER> 

Как я могу это сделать?

+1

Пожалуйста, открепите свой XML, чтобы мы могли его прочитать. –

+0

Какой язык программирования вы используете (или можете использовать)? –

+0

Я использую Stax с java – timo

ответ

2

От вас английский Я понимаю, что вы хотите разбить большой XML-файл на несколько небольших файлов. Лучший один является http://vtd-xml.sourceforge.net/

Пример кода, следующий код будет разделен большой XML, основанный на XPath, TopTag/ChildTag


import java.io.File; 
import java.io.FileOutputStream; 

import com.ximpleware.AutoPilot; 
import com.ximpleware.FastLongBuffer; 
import com.ximpleware.VTDGen; 
import com.ximpleware.VTDNav; 

// This example shows how to split XML 
public class Split { 
    public static void main(String[] args) { 
     String prefix = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<TopTag xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"; 
     String suffix = "\n</TopTag<"; 
     try { 

      VTDGen vg = new VTDGen(); 
      if (vg.parseFile(args[0], false)) { 
       int splitBy = Integer.parseInt(args[1]); 
       String filePrefix = args[2]; 
       VTDNav vn = vg.getNav(); 
       AutoPilot ap = new AutoPilot(vn); 
       ap.selectXPath("/TopTag/ChildTag"); 
       // flb contains all the offset and length of the segments to be 
       // skipped 
       FastLongBuffer flb = new FastLongBuffer(4); 
       int i; 
       byte[] xml = vn.getXML().getBytes(); 
       while ((i = ap.evalXPath()) != -1) { 
        flb.append(vn.getElementFragment()); 
       } 
       int size = flb.size(); 
       if (size != 0) { 
        File fo = null; 
        FileOutputStream fos = null; 
        for (int k = 0; k < size; k++) { 
         if (k % splitBy == 0) { 
          if (fo != null) { 
           fos.write(suffix.getBytes()); 
           fos.close(); 
           fo = null; 
          } 
         } 
         if (fo == null) { 
          fo = new File(filePrefix + k + ".xml"); 
          fos = new FileOutputStream(fo); 
          fos.write(prefix.getBytes()); 
         } 
         fos.write(xml, flb.lower32At(k), flb.upper32At(k)); 
        } 
        if (fo != null) { 
         fos.write(suffix.getBytes()); 
         fos.close(); 
         fo = null; 
        } 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+1

Я понимаю, что vdt-xml работает, загружая весь XML-документ в память. Несмотря на то, что он утверждает, что эффективно использует память, даже по собственным оценкам, для XML-документа размером 1 Гбит может потребоваться до 1.5 Гб кучи. –

+0

@stephenC - вы можете использовать расширенный vtd-xml в режиме отображения памяти ... –

2

В вопросе программирования, это просто вопрос StAX программирования.

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

Смежные вопросы