2015-10-08 1 views
1
{ 

public class XmlSplit { 

public static void main(String [] args) throws Exception { 
File input = new File("C:\\Users\\Edit5.xml"); 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
Document doc = (Document) dbf.newDocumentBuilder().parse(input); 
XPath xpath = XPathFactory.newInstance().newXPath(); 
NodeList nodes = (NodeList) xpath.evaluate("//transaction", doc, XPathConstants.NODESET); 
int itemsPerFile = 2000; 
int fileNumber = 0; 
Document currentDoc = (Document) dbf.newDocumentBuilder().newDocument(); 
Node rootNode; 


rootNode = currentDoc.createElement("transactions"); 
File currentFile = new File(fileNumber+".xml"); 
for (int i=1; i <= nodes.getLength(); i++) { 
    Node imported = currentDoc.importNode(nodes.item(i-1), true); 
    rootNode.appendChild(imported); 

    if (i % itemsPerFile == 0) { 
     writeToFile(rootNode, currentFile); 
     rootNode = currentDoc.createElement("transactions"); 
     currentFile = new File((++fileNumber)+"C:\\UsersEdit1.xml"); 
    } 
    else 
    { 
      writeToFile(rootNode, currentFile); 
    } 
} 

} 

private static void writeToFile(Node node, File file) throws Exception { 
Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.transform(new DOMSource(node), new StreamResult(new FileWriter("C:\\UsersEdit1.xml"))); 
} 
} 


} 

Привет Я расщеплении большой XML используя DOM анализатор, но это занимает много времени, чтобы расколоть XML .Can кто-то помочь мне с этим для этого с помощью анализатора stax. Также он не генерирует новый файл. Это также проблема. Раньше Если кто-то может это сделать, пожалуйста, помогите мне.большой XML Расщепление с помощью DOM парсер, но я хочу использовать Stax анализатор поэтому увеличение производительности

+0

Насколько велика велика? 50Kb или 50Gb? И как медленно медленно? Предоставление нам некоторых цифр поможет нам оценить, является ли отмена существующего подхода и попытки чего-то другого сделать разумным. –

+0

Размер файла составляет 150 мб, и он выдает из памяти кучу ошибку. И если мы передаем небольшой размер XML, например, для 50 мб, требуется больше половины часа. –

+0

Я не понимаю, почему это должно занять много времени: здесь может быть какая-то проблема, которая не связана с кодом, который вы нам показали. Вы пробовали использовать профиль процессора Java, чтобы узнать, куда идет время? –

ответ

0

Вот код для разбиения вашего XML в vtd-xml ...

import com.ximpleware.*; 
import java.io.*; 

public class splitter { 
    public static void main(String[] s) throws VTDException, IOException { 
     VTDGen vg = new VTDGen(); 
     if (!vg.parseFile("input.xml", false)) 
      return; 
     VTDNav vn = vg.getNav(); 
     AutoPilot ap = new AutoPilot(vn); 
     ap.selectXPath("//transaction"); 
     int i=0,j=0,k=0; 
     File f = new File("transactionList"+k+".xml"); 
     FileOutputStream fos = new FileOutputStream(f); 
     byte[] head="<transactions>\n".getBytes(); 
     byte[] tail="\n</transactions>".getBytes(); 
     fos.write(head); 
     while((i=ap.evalXPath())!=-1){ 
      long l=vn.getElementFragment(); 
      fos.write(vn.getXML().getBytes(), (int)l, (int)(l>>32)); 
      j++; 
      if ((j+1)%2000==0){ 
       k++; 
       fos.write(tail); 
       fos.close(); 
       f = new File("transactionList"+k+".xml"); 
       fos = new FileOutputStream(f); 
       fos.write(head); 
      } 
     } 
     fos.write(tail); 
     fos.close(); 
    } 
} 
Смежные вопросы